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.

3 Respostas para “Apontadores em linguagem C – Noções elementares”

  1. Hpeca Diz:

    adorei este post, estou a aprender a programar em c++, e ajudou-me imenso a compreender melhor os apontadores. Muito obrigado

  2. ermelinda barros furtado Diz:

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

  3. João Pedor Diz:

    vou ter teste daqui a umas horas e já não me restam dúvidas sobre apontadores e ponteiros…tass bem sr.graciano torrão =D


Deixar uma Resposta