Pressupostos: Conhecimentos elementares de programação em Linguagem C/C++ e do conceito de variável.
Objectivo: Compreender o conceito de apontador.
A ideia por detrás do conceito de apontador é muito simples, e assenta no facto de todas as variáveis serem armazenadas na memória RAM do computador, tendo obrigatoriamente que ficar associadas a um endereço de memória.
Quando num programa utilizamos a instrução int x=33; estamos a indicar ao compilador para reservar um espaço na memória para poder armazenar valores do tipo inteiro, com o número de bits associado a este para cada compilador e/ou arquitectura. Simultaneamente é atribuído o valor 33 à variável x, o que significa que no endereço de memória associado à variável x é armazenado o valor 33.
Daqui em diante sempre que pretendermos utilizar ou alterar o valor armazenado neste endereço de memória bastará utilizar uma referência ao nome da variável ( x ) para o efeito.
No exemplo apresentado ( int x=33; ) diz-se que foi realizada uma declaração seguida da inicialização (Inicialização automática).
Em termos gráficos, fica representado na figura seguinte o que se passa ao nível da memória do computador:
|
|
x
|
|
|
< - Nome da variável
|
|
|
33
|
|
|
< - Conteúdo
|
|
100
|
101
|
102
|
103
|
< - Endereço de memória
|
Notar que foi utilizado o endereço de memória 101(endereço fictício) para armazenar o valor 33. Isto significa apenas que a representação binária do número 33 é armazenada a partir do endereço 101 e ocupa um número de bits correspondente ao tipo de dados declarado.
Depois de chegados a este ponto podemos avançar para o conceito de apontador.
Um apontador é uma variável como qualquer outra, mas que é utilizada para armazenar o endereço de memória de outra variável.
A imagem seguinte representa a evolução do caso acima apresentado, acrescido da utilização de um apontador “ptr” que irá ser utilizado para manipular o conteúdo do endereço de memória onde se encontra armazenado o valor de x:
|
|
x
|
|
ptr
|
< - Nome da variável
|
|
|
33
|
|
101
|
< - Conteúdo
|
|
100
|
101
|
102
|
103
|
< - Endereço de memória
|
Acabamos de criar uma variável nova, mas agora trata-se de um apontador:
- O nome do apontador é ptr.
- O apontador ptr encontra-se armazenado na posição de memória 103.
- O conteúdo de ptr é o endereço de memória da variável x.
Conclusão: ptr é um apontador para a variável x.
Vamos avançar com um exemplo com valores reais:
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int x=33;
int *ptr_x=&x;
cout << "-- Estado inicial ---------------------------------------\n";
cout << "\tValor armazenado na variável x : " << x << endl;
cout << "\tEndereço de memória da variável x : " << &x << endl;
cout << "\tValor armazenado na variável ptr_x : " << ptr_x << endl;
cout << "\tEndereço de memória da variável ptr_x: " << &ptr_x << endl;
cout << "-- Ler um novo valor para x ------------------------------\n";
cout << "x = "; cin >> x;
cout << "\tValor armazenado na variável x : " << x << endl;
cout << "\tEndereço de memória da variável x : " << &x << endl;
cout << "\tValor armazenado na variável ptr_x : " << ptr_x << endl;
cout << "\tEndereço de memória da variável ptr_x: " << &ptr_x << endl;
return 0;
}
Comentários linha-a-linha: Apenas me vou referir ao que interessa abordar sobre este assunto.
Linha 5: Como já referi, esta linha de código faz a inicialização automática da variável x, do tipo inteiro, com o valor inicial 33.
Linha 6: Para compreender o que se passa nesta linha é necessário conhecer os operadores unários * e & .
De forma simplista temos:
- & significa “endereço de”.
- * significa “aponta para”, ou se quisermos, “conteúdo do endereço apontado por”.
Foi então criado um apontador ptr. cujo conteúdo foi automaticamente inicializado com o valor correspondente ao endereço de memória da variável x.
Note-se que a posição do caracter * pode ser feita de outras formas, tal como demonstrado a seguir, mas a primeira é a mais utilizada.
int *ptr;
int* ptr;
int * ptr;
Restantes linhas: Servem apenas para ir mostrando o que se passa com estas variáveis no decorrer da execução deste pequeno programa.
Nota final: Espero ter conseguido passa a mensagem sobre o que são os apontadores, mas termino recordando que este é uma assunto muito vasto e que muito fica por dizer, mas sem se compreender bem o que aqui foi dito não adianta muito avançar.