You are on page 1of 3

www.tiexpert.

net

Pg. 1 de 3

Ponteiros para Ponteiros


C/C++ nos permite criar, tambm, ponteiros com nveis de apontamento. O que isso quer dizer? Simples. possvel criar um ponteiro que aponte para outro ponteiro, criando assim nveis, pois um ponteiro poder apontar para outro ponteiro, que, por sua vez, aponta para outro ponteiro, que aponta para um ponteiro diferente e assim por diante. A sintaxe para se criar ponteiros para ponteiros a mesma de ponteiros comuns, apenas a forma de acessar seus valores diferente, pois para cada nvel de apontamento usaremos um dereferenciador. Por exemplo, se um ponteiro aponta para um ponteiro que aponta para um valor inteiro, para acessarmos esse valor inteiro a partir do primeiro ponteiro usaramos dois asterscos (**), ao invs de apenas um (*). Isso se d ao fato que um ponteiro pode mudar o valor de outro ponteiro de acordo com seu nvel. O exemplo abaixo demonstra uma sintaxe simples. #include <iostream> using namespace std; int main (void) { int a=10, b=50; int *ptr; // ponteiro de inteiro int **ptrPtr; // ponteiro de um ponteiro inteiro ptr = &a; ptrPtr = &ptr; cout << "O valor final de ptrPtr e " << **ptrPtr << endl; system("pause"); return EXIT_SUCCESS; } O cdigo acima contem duas variveis inteiras (a e b) inicializados com os valores 10 e 50 respectivamente. Logo aps, h uma varivel de ponteiro (*ptr) e uma varivel de ponteiro para ponteiro (**ptrPtr). Ento, atribuimos o endereo da varivel inteira a em *ptr. Agora *prt aponta para a. Aps isso, atribuimos o endereo do ponteiro *ptr ao ponteiro **ptrPtr. Neste momento **ptrPtr passa apontar para *ptr. Nesse instante devemos prestar atenco no seguinte detalhe, no momento da impresso da mensagem "O valor final de ptrPtr e "... usamos o ponteiro do ponteiro para chegar at o valor de a.

Entendendo os Nveis de Apontamento


Quando usamos ponteiros de ponteiros podemos usar os nveis de apontamento que so determinados pelo nmero de asteriscos que precedem o ponteiro. Portanto, se um ponteiro aponta para um ponteiro que tambm aponta para um ponteiro que contem um endereo de uma varivel char, usaramos neste caso trs asterscos. #include <iostream> using namespace std; int main (void) { char letra='a'; char *ptrChar; char **ptrPtrChar; char ***ptrPtr; ptrChar = &letra; ptrPtrChar = &ptrChar; ptrPtr = &ptrPtrChar; cout << "O valor final de ptrPtr e " << ***ptrPtr << endl; http://www.tiexpert.net/programacao/c/ponteiro-para-ponteiro.php

www.tiexpert.net
system("pause"); return EXIT_SUCCESS; }

Pg. 2 de 3

Para entender melhor o acesso indireto que o ponteiro executa, vejamos o diagrama abaixo.

Este diagrama demonstra o que cada um dos asteriscos representa. Sabendo disso possvel alterar tanto o valor final da varivel quanto o endereo apontado pelos ponteiros intermedirios. Vejamos a exemplificao abaixo. #include <iostream> using namespace std; int main (void) { float var1 = 25.5; float var2 = 72.8; float *ptr; float **ptrPtr; ptr = &var1; ptrPtr = &ptr; cout << "O valor final de ptrPtr e " << **ptrPtr << endl; cout << "Pois o endereco de ptr e " << ptr << endl; *ptrPtr = &var2; //novo endereo no ponteiro intermedirio cout << "\nO valor final de ptrPtr e " << **ptrPtr << endl; cout << "Pois o endereco de ptr e " << ptr << endl; system("pause"); return EXIT_SUCCESS; } No cdigo acima podemos perceber a troca de um ponteiro intermedirio. A princpio atribuimos o endereo da varivel var1 ao ponteiro ptr. Depois, atribuimos o endereo do ponteiro ptr ao ponteiro ptrPtr. Na primeira vez que mandamos imprimir **ptrPtr (Importante! Note os dois asteriscos) ser apresentado o valor contido em var1, porque ptrPtr acessa var1 indiretamente pelo ponteiro ptr. Quando fazemos a operao *ptrPtr = &var2;, na verdade, no estamos alterando o valor contido em var1, mas o endereo contido no ponteiro ptr, porque usamos apenas um asterisco em ptrPtr. Ou seja, usando apenas um asterisco acessaremos o ponteiro, no o valor apontado pelo ponteiro. Vejamos:

http://www.tiexpert.net/programacao/c/ponteiro-para-ponteiro.php

www.tiexpert.net

Pg. 3 de 3

Esse astersco representa exatamente o ponteiro intermedirio. Portanto, agora o ponteiro ptr no aponta mais para var1, ele aponta para var2. Na segunda vez que imprimimos o valor de **ptrPtr no aparecer o valor de var1, mas o valor de var2, porque o endereo contido no ponteiro intermedirio ptr foi alterado para apontar para var2.
Autor: Denys William Xavier Este artigo est sob Licena Creative Commons Para ver uma cpia desta licena, visite http://creativecommons.org/licenses/by-nc-sa/2.5/br/ ou envie uma carta para Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.

http://www.tiexpert.net/programacao/c/ponteiro-para-ponteiro.php

You might also like