Ponteiros
Um ponteiro (= apontador = pointer) é um tipo especial de variável que armazena endereços. Um ponteiro pode ter o valor especial que não é o endereço de lugar algum. NULL
A constante NULL está definida no arquivo-interface stdlib e seu valor é 0 na maioria dos computadores.
Se um ponteiro p armazena o endereço de uma variável i, podemos dizer "p aponta para i" ou "p é o endereço de i" (querendo dizer "o ponteiro p aponta para i" no primeiro caso e "o valor de p é o endereço de i" no segundo). Se um ponteiro p tem valor diferente de NULL então é o valor do objeto apontado por p. *p (Não confunda esse uso de "*" com o operador de multiplicação!) Por exemplo, se i é uma variável e p é igual a &i então dizer "*p" é o mesmo que dizer "i". | Figura esquerda: um ponteiro p, armazenado no endereço 90001, contém o endereço de um inteiro. Figura direita: representação esquemática da situação. |
Há vários tipos de ponteiros: ponteiros para caracteres, ponteiros para inteiros, ponteiros para ponteiros para inteiros, ponteiros para registros etc. O computador faz questão de saber de que tipo de ponteiro você está falando. Para declarar um ponteiro p para um inteiro, diga int *p;
Para declarar um ponteiro p para um registro cel, diga struct cel *p;
Um ponteiro r para um ponteiro que apontará um inteiro é declarado assim: int **r;
Exemplos
Suponha que a, b e c são variáveis inteiras. Eis um jeito bobo de fazer "c = a+b": int *p; /* p é um ponteiro para um inteiro */ int *q; p = &a; /* o valor de p é o endereço de a */ q = &b; /* q aponta para b */ c = *p + *q;
Outro exemplo bobo: int *p; int **r; /* r é um ponteiro para um ponteiro para um inteiro */ p = &a; /* p aponta para a */ r = &p; /* r aponta para p e *r aponta para a */ c = **r + b;
Aplicação