// [19/11/2004]
//
// MAC110 - 2004
//
// Apontador: examinando sequência de valores como um vetor 
//
// O funcionamento deste exemplo depende da "plataforma" em que está sendo executado.
//
// Em um PC+Linux, o endereçamento de memória é decrescente. Por exemplo, declarando
//
//    int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;
//
// se a variável "x0" ficar na posição de memória X, então "x1" fica em X-i, "x2" em
// X-2i e assim por diante ("i" é a quantidade de bytes utilizados por um "int").

int main (void) {
  // Todas as variáveis são guardadas em posições consecutivas de memória, assim,
  // "x0" e "x1" são "vizinhos" na memória (o mesmo com "x1" e "x2"...)
  int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9;

  int *ap; // esta variável é para guardar endereços de variáveis tipo "int"

  int i;

  printf("Exemplo de tratamento de variáveis consecutivas como se fosse um vetor\n");

  printf("Teste de endereços: \n");
  printf(" x0: %d\n", &x0);
  printf(" x1: %d\n", &x1);
  printf(" ...\n");
  printf(" x9: %d\n", &x9);


  // define as variáveis via apontador para inteiros "ap"
  ap = &x0; // pega endereço de x0 (que tem endereço mais alto)
  for (i=0; i<10; i++)
      *(ap-i) = 1009-i; // armazena no endereço "ap-i" o valor "1000+i"

  printf(" x0=%d, x1=%d, x2=%d, x3=%d, x4=%d, x5=%d, x6=%d, x7=%d, x8=%d, x9=%d\n",
           x0, x1, x2, x3, x4, x5, x6, x7, x8, x9);

  // Vou listar novamente os elementos guardados nas variáveis x0 a x9, de dois
  // modos: como se fossem um vetor de nome "ap[]" e como apontados
  printf("Agora olhando como se fosse um vetor: \n");
  ap = &x9; // como de x0 a x9 é decrescente, começo com o endereço de x9
  for (i=0; i<10; i++)
      printf("ap[%d] = %d = %d\n", i, 
              ap[i],                  // lista como sendo vetor
              *(ap+i));               // lista como sendo apontador

  return 1;

  }

