Desreferenciando Ponteiros
O principal uso de um valor de ponteiro é desreferenciá-lo (acessar os dados para os quais ele aponta) com o operador unário ‘*
’. Por exemplo, *&i
é o valor no endereço de i
— que é justamente i
. As duas expressões são equivalentes, desde que &i
seja válido.
Uma expressão de desreferência de ponteiro cujo tipo é um dado (e não uma função) é um lvalue.
Os ponteiros se tornam realmente úteis quando os armazenamos em algum lugar e os usamos depois. Aqui está um exemplo simples para ilustrar essa prática:
{
int i;
int *ptr;
ptr = &i;
i = 5;
…
return *ptr; /* Retorna 5, obtido de i. */
}
Isso mostra como declarar a variável ptr
com o tipo int *
(ponteiro para int
), armazenar nela um valor de ponteiro (apontando para i
) e usá-lo depois para obter o valor do objeto para o qual ele aponta (o valor em i
).
Aqui está outro exemplo de uso de um ponteiro para uma variável:
/* Define a variável global i. */
int i = 2;
int
foo (void)
{
/* Armazena o endereço da variável global i. */
int *global_i = &i;
/* Declara uma i local, ocultando a i global. */
int i = 5;
/* Imprime o valor da i global e da i local. */
printf ("global i: %d\nlocal i: %d\n", *global_i, i);
return i;
}
É claro que, em um programa real, seria muito mais limpo usar nomes diferentes para essas duas variáveis, em vez de chamar ambas de i
. Mas é difícil ilustrar esse ponto sintático com um código “limpo”. Se alguém puder fornecer um exemplo útil para ilustrar isso com mais clareza, ele será bem-vindo.
Atualizado
Isto foi útil?