Uma das grandes características dos ponteiros é que eles não servem para
guardar valor! Sim, eles não guardam valor como as variáveis comuns!
Ponteiros, servem para apontar. Eles apontam para outra variável.
Este é um conceito difícil de entender, mas vamos dar um exemplo... Digamos,
o seguinte, temos três pessoas: Kizuki, Nadesco e Kaoru. Kizuki está
apontando para Nadesco e esta aponta para Kaoru.
Kizuki -> Nadesco -> Kaoru
Assim, se olharmos para kizuki veremos que ela esta apontando para algum
lugar, se olharmos para o lugar veremos Nadesco que esta apontando para
outra localização. Agora, ao olhar onde a Nadesco aponta veríamos a Kaoru,
que não seria um ponteiro! Assim, o único valor correto seria
o ultimo o da Kaoru! Difícil, entender? Vamos a programação!
#include <stdio.h>
void main(void)
{
int Kaoru, *Nadesco, *Sakura, **Kizuki; //Quatro nomes de animes que adoro ^^
scanf(" %d", &Kaoru); //Passa o endereço de memoria de Kaoru pra função scanf
Nadesco=&Kaoru; //Nadesco recebe o endereço de memoria de Kaoru
Kizuki = &Nadesco;
Sakura=Nadesco; //Sakura recebe o endereço da memoria, mesmo sem ser obrigada com &
printf("%d\n", Kaoru); //imprime o valor lido
*Sakura = 5; //Kaoru virará 5, pois Sakura aponta Kaoru.
printf("%d\n", Kaoru); //mostra 5
**Kizuki = 3; //Kaoru virará 3, pois Nadesco aponta Kaoru.
printf("%d\n", Kaoru); //imprime 3
*Kizuki = Sakura; // Nadesco passara a apontar para Sakura que aponta Kaoru.
**Kizuki=&Sakura;
printf("%d\n", **Kizuki); //deve mostrar um numero estranho, se não tiver errado
}
Aqui, temos vários exemplos! Mas, infelizmente o programa ficou meio
difícil de entender. Primeiro declaramos uma variável como ponteiro quando
botamos um * (asterisco) na frente de seu nome. Mas, podemos criar ponteiros
que apontam para outros apontadores que seria ** (asterisco asterisco) ou
ainda criarmos ponteiros para ponteiros para ponteiros com três asteriscos.
Mas, mais de dois já é sem utilidade.
Quando fazemos a atribuição de um ponteiro, podemos usar duas formas:
Sakura = Nadesco;
Sakura = &Nadesco;
As duas passaram o endereço de memória de Nadesco para o apontador Sakura.
Mas, se tivermos um apontador de dois níveis (dois asteriscos) o uso de & se
torna obrigatório!
Ao fazermos:
int *Kagome; //Tirado de mais um anime :D
Dizemos que o conteúdo, representado por asterisco, que Kagome aponta será
do tipo int.
Podemos criar uma variável que poderia apontar para todos os tipos da
seguinte forma:
void *Kagome;
Para acessarmos um ponteiro usamos:
*Sakura = 5;
**Kizuki = 3;
Como disse, um pouco mais pra cima, o asterisco simboliza o "conteudo"...
Assim, quando digitamos a primeira linha estamos pedindo que 5 seja
atribuído ao conteúdo da Sakura! Agora, o caso da Kizuki pedimos que 3 seja
atribuído ao conteúdo do conteúdo da Kizuki!
Me desculpem se ficou meio confuso o texto! Mas, eu acho bastante simples!
Qualquer duvida, os comentem o texto!