Apontadores em Linguagem C – Noções Elementares

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Apontadores em Linguagem C – Noções Elementares

Mensagem por Evandro Abu Kamel em Sex 12 Fev 2010, 12:58

Esses dias percebi que muita gente tem dificuldade em entender o conceito de apontadores em C, principalmente nas aulas do novo professor de P.A.. Enão resolvi pesquisar sobre o assunto, pois nem eu domino tanto. Então segue abaixo um texto bem explicativo.


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:

Código:
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
int x = 33; // linha 5
int *ptr_x = &x; // linha 6

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.

Código:
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.

Fonte: http://gracianotorrao.wordpress.com/2008/05/17/apontadores-em-linguagem-c-%E2%80%93-nocoes-elementares/

É isso aí pessoal, espero que iso ajude mesmo. Smile
Até a próxima.

_________________
"Faça as coisas o mais simples que você puder,
porém, não as mais simples." Albert Einstein

avatar
Evandro Abu Kamel
Administrador
Administrador

Número de Mensagens : 222
Idade : 28
Data de inscrição : 11/03/2009

Ver perfil do usuário http://forum.clubedosistema.com

Voltar ao Topo Ir em baixo

Curso de C

Mensagem por Evaldo em Sex 26 Fev 2010, 19:38

Usei uma apostila da UFMG quando fazia Ciência da Computação e achei muito boa. Se alguém se interessar, nessa página da UFMG eles disponibilizam a apostila em .pdf, .doc e .html.
site: http://www.ead.cpdee.ufmg.br/cursos/C/download.html

A aula nº 6 trata justamente de ponteiros.
Dêem uma olhada, talvez ajude quem vier a ter alguma dificuldade.
avatar
Evaldo
Membro
Membro

Número de Mensagens : 2
Data de inscrição : 15/08/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum