O conceito de apontador ou ponteiro é nada mais do que uma seta a “apontar” para outro local de memória.
Por outras palavras, podemos dizer que é um endereço de memória que contém uma seta a apontar para outro local em memória. Dando uma vista de olhos na imagem a cima, observamos que o endereço de memória 0100 é um ponteiro e está a apontar para o endereço 3000.
Nomeadamente na linguagem C um ponteiro deve ter um tipo primitivo ou não (caso seja definida alguma estrutura), nomeadamente inteiro, string, booleano etc.
Em C um ponteiro declara-se da seguinte forma:
int *ponteiro ;
Nunca esquecer que todo o ponteiro contem um asterisco antes do seu nome, pois é esse carácter (*) que o define.
#include <stdio.h>
int main()
{
int i = 2 ;
int *p=NULL ;
p = &i ;
*p = 20 ;
printf ("%dt%dt%pn", i, *p, p);
return 0;
}
Inicialmente é declarada uma variável estática i com o valor 2, e declaramos um ponteiro *p.
É muito importante referir que na declaração de um ponteiro é quase obrigatório atribuir-lhe o valor de NULL, pois ele poderá aceder a um pedaço de memória que não lhe pertence e pode causar problemas no nosso programa, ao que normalmente chamamos de “segmentation fault”.
Tendo isso então fazemos a atribuição p=&i , que em bom português se traduz pelo seguinte:
“Este apontador p que eu declarei vai conter o endereço da variável i, ou seja o p é uma seta para o i, se eu o alterar altero o valor de i“.
Pois bem, foi isso que fiz: *p=20
Atribui ao p o valor de 20, onde este p é o i, a tal seta. O que o ponteiro p irá fazer é colocar o valor 20 em i.
(Consequentemente o valor 2 que estava guardado em i foi perdido.)
Vendo então o output:
20 20 0012FF21
i e de *p serão iguais, já que p aponta para i. O terceiro valor é o endereço de memória onde está i (e, consequentemente, é o próprio valor de p).
