Dando continuidade ao estudo dos ponteiros aqui em nosso Curso de Programação C, vamos responder a seguinte pergunta: Existe ponteiro pra ponteiro?
SIM! Claro que existe!
Temos um ponteiro pra ponteiro quando uma variável do tipo ponteiro guarda um endereço de memória de outra variável que também é um ponteiro.
Observe o exemplo de código a seguir. A variável A é do tipo int. A variável B é um ponteiro para um inteiro e a variável C é um ponteiro pra ponteiro de inteiro.
// A - variável inteira // B - ponteiro para um inteiro // C - ponteiro para um ponteiro para um inteiro int A = 100, *B, **C;
A variável B é um ponteiro para um inteiro. Assim, ela pode receber o endereço da variável A, que é do tipo int, mas não pode receber o endereço da variável C.
Em contrapartida, a variável C é um ponteiro pra ponteiro do tipo int. Assim, a variável C pode receber o endereço da variável B mas não pode receber o endereço da variável A.
Já vimos que para acessar o conteúdo apontado por um ponteiro basta escrevermos o nome do ponteiro com um asterisco ( * ) à esquerda. Para acessar o conteúdo de um ponteiro pra ponteiro basta escrevermos o nome do ponteiro com dois asteriscos ( ** ) à esquerda, assim:
printf("Conteudo apontado por C: %d\n", **C);
Perceba que esta ideia se propaga adiante. Podemos ter:
– ponteiro (int *B);
– ponteiro pra ponteiro(int **C);
– ponteiro pra ponteiro pra ponteiro(int ***D);
e assim por diante. É o problema que você está resolvendo que vai determinar a necessidade ou não de ponteiros encadeados.
Exemplo completo em C de ponteiro pra ponteiro
*/ Aula 191: O que é ponteiro para ponteiro? Código escrito por Wagner Gaspar Maior de 2021 */ int main(){ int A = 100, *B, **C; B = &A; C = &B; printf("Endereco de A: %p\tConteudo de A: %d\n", &A, A); printf("Endereco de B: %p\tConteudo de B: %p\n", &B, B); printf("Conteudo apontado por B: %d\n", *B); printf("Endereco de C: %p\tConteudo de C: %p\n", &C, C); printf("Conteudo apontado por C: %d\n", **C); return 0; }