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;
}
