Arquitetura de memória

Arquitetura de memória

endereço conteúdo
0 10101010
1 11111010
\(\vdots\) \(\vdots\)
65535 11010010

Arquitetura de memória

endereço conteúdo
0x0000 10101010
0x0001 11111010
\(\vdots\) \(\vdots\)
0xffff 11010010

Variáveis

Exemplo

Operador &

  int main(void) {
     int i, j;
     printf("endereço i: %p\n", &i);
     printf("endereço j: %p\n", &j);
  }

Exemplo:

endereço i: 0x7ffe26476b20
endereço j: 0x7ffe26476b24

(Neste computador cada int ocupa 4 bytes.)

Apontadores

Declarar apontadores

   int *p;   /* `p` é um apontador para
                 valores de tipo `int` */
   char  *p;  // apontador para carateres
   double *p; // apontador para doubles
   long  *p;  // apontador para longs

Inicializar apontadores

   int *p;  // não inicializado

Inicializar apontadores (cont.)

   int i;
   int *p;
   ...
   p = &i;

Operador *

   int i, *p;
   i = 42;
   p = &i;
   printf("%d\n", *p); // imprime 42

Operador *

   int i, *p;
   p = &i;
   i = 42 
   *p = 43; 
   printf("%d\n", i); // imprime 43

Exemplo passo-a-passo

p = &i;

i = 42;

*p = 43;

Operador *

   int *p;
   printf("%d\n", *p);   /* ERRO */
   int *p;
   *p = 1;               /* ERRO */

Atribuição de apontadores

   int i;
   int *p, *q;
   p = &i;
   q = p;

Atribuição de apontadores

   *p = 1;

   *q = 2;

Atribuição de apontadores

Atribuição de apontadores

p = &i; q = &j; i = 1;

*q = *p;

Apontadores como argumentos

Exemplo: trocar duas variáveis

/* Trocar duas variáveis; versão errada */
void trocar(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

Versão usando apontadores

void trocar(int *pa, int *pb) {
   int temp;
   temp = *pa;
   *pa = *pb;
   *pb = temp;
}
   int a, b;
   ...
   trocar(&a, &b);  // trocar `a' com `b'