Apontadores em linguagem C – Noções elementares

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;
}
Download do código fonte: http://www.box.net/shared/kmxz8obkg8

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.

Update(2012/09/12): Um vídeo excelente que resume tudo muito bem.

Anúncios

11 thoughts on “Apontadores em linguagem C – Noções elementares

  1. Sou Ermelinda ,estou estudando engenharia sistema e informática na unipiaget de cv.Já tenho conhecimento suficiete de APONTADOR graças agracianotorrao…

  2. Muito boa essa sua explicaçao sobre apontadores.Tava mais ou menos umas 2h que eu procurava o que era apontador,mas so aparecia códigos.
    vlw

  3. Eu estou a começar a trabalhar em estruturas de dados dinâmicas e este post ajudou me imenso na compreensão a nível lógico sobre a utilidade dos apontadores , e em linguagem de programação, fez me perceber como se manipula em linhas de código.

    Parabéns,

    Rui Soares

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s