Entender ponteiros (e ponteiros para ponteiros) nem sempre é facil quando estamos vendo C ou C++ pela primeira vez.
Com auxilio do pre-processador C, vejamos se este exemplo pode ser elucidativo:
[PHP]#include
#include "pointer.h"
int main ()
{
int x = 0; // variavel de exemplo
int pointer y; // ponteiro
y = address(x); // y aponta para o endereco de x
x++; // incrementamos o valor de x
value(y)++; // incremento indireto (via ponteiro)
printf("value %d %d\n",x, value(y) );
printf("address %p %p\n",address(x), y );
return 0;
}[/PHP]
Convenhamos, ficou simples, não?
Eu ganho uma 'palavra reservada' para declarar um ponteiro e uma 'função' para acessar o valor desse ponteiro e, assim, posso manipula-lo. Conseguir o endereço de uma variavel também ficou mais claro, agora.
Vejamos outro exemplo supimpa:
[PHP]#include
#include "pointer.h"
int main ()
{
int x = 0; // variavel de exemplo
int pointer y; // ponteiro
int pointer pointer z; // ponteiro para ponteiro
y = address(x); // y aponta para o endereco de x
assign(z,y); // idem, mas de outra forma (z aponta pra y)
x++; // incrementamos o valor de x
value(y)++; // incremento indireto (via ponteiro)
value(value(z))++; // incremento mais indireto ainda!
printf("value %d %d %d\n",x, value(y), value(value(z)));
printf("address %p %p %p\n",address(x), y ,value(z));
return 0;
}
[/PHP]
Qual é o conteudo do meu 'pointer.h' ? simples:
[PHP]#define pointer * // usado em declaracoes
#define value(a) (*a) // usado para acessar o valor do ponteiro
#define address(a) (&(a)) // usado para acessar o endereco de uma variavel
#define assign(a,b) a = address(b) // talvez seja util...[/PHP]
O codigo gerado pelo pre-processador fica assim:
[PHP]int main ()
{
int x = 0; // variavel de exemplo
int * y; // ponteiro
int * * z; // ponteiro para ponteiro
y = (&(x)); // y aponta para o endereco de x
z = (&(y)); // idem, mas de outra forma (z aponta pra y)
x++; // incrementamos o valor de x
(*y)++; // incremento indireto (via ponteiro)
(*(*z))++; // incremento mais indireto ainda!
printf("value %d %d %d\n",x, (*y), (*(*z)));
printf("address %p %p %p\n",(&(x)), y ,(*z));
return 0;
}[/PHP]
Enfim, façam um bom proveito deste recurso
peczenyj
Geek
Registrado
3K Mensagens
75 Curtidas