Você está na página 1de 2

DISCIPLINA: ALGORITMOS E ESTRUTURAS DE DADOS I (DCC 003) - Professora: Mirella M.

Moro Fonte: MOKARZEL e SOMA: Introduo Cincia da Computao

9.1 INTRODUO S VARIVEIS DO TIPO PONTEIROS 9.1.1 Declaraes e atribuies de ponteiros


As variveis dos programas apresentados nos captulos anteriores so usadas para guardar e manipular valores de determinados tipos. Variveis do tipo ponteiro so destinadas a guardar e manipular endereos de memria. Considere, por exemplo, o seguinte fragmento do programa:
float a = 13.5, *p; int b = 15, *q; p = &a; q = &b;

Nele, as variveis a e b so, respectivamente, declaradas como sendo dos tipos float e int e inicializadas com os valores 13.5 e 15. As variveis p e q so ponteiros para os tipos float e int, respectivamente. No mesmo segmento, p recebe o endereo de a e q recebe o endereo de b. A figura 9.1 mostra um mapa da memria depois de sua execuo, em certo computador, num dado ambiente de programao. Observa-se que as variveis q, b, p e a foram alocadas nos endereos 604972062, 6044972066, 604972068 e 604972072, respectivamente. Ento,k nesse ambiente, as variveis e tipo ponteiro ocupam 4 bytes, para poderem guardar endereos. O contedo das variveis p e q so os endereos de a e b, respectivamente. Diz-se que p aponta para a e q aponta para b, e tambm que a apontada por p e b apontada por q. a Figura 9.2 mostra duas formas de interpretao grfica para esses apontamentos. Numa declarao, o caractere * (asterisco) antes do nome de uma varivel a classifica como um ponteiro para o tipo especificado nessa declarao. Assim, alm de informar que tal varivel um ponteiro, necessrio dizer qual o tipo do valor a ser armazsenado nos endereos a ocuparem essas variveis. Por exemplo, usando-se as declaraes anteriores, alguns compiladores s permitem que a varivel p aponte para locais destinados a armazenar valores do tipo float. Nos exemplos deste livro, isso serve de orientao para a programao. Como j foi visto no estudo da funo scanf(), o caractere & seguido do nome de uma varivel denota o endereo da mesma. Assim, num comando de atribuio, uma varivel ponteiro pode receber o endereo de outra varivel, desde que a seguna seja do tipo a ser apontado pela primeira.

... 604972062 604972066 604972066 604972068 604972072 6049072072 13.5 ...


Figura 9.1 Mapa da memria para um fragmento de programa

15

b p

p ou p

13.5 13.5

a a

q q

15 15

b b

Figura 9.2 Duas representaes grficas dos apontamentos da Figura 9.1 #include <stdio.h> main() { float a=13.5, *p; int b = 15, *q; p = &a; q = &b; printf("a = %g; b = %d; \np = &a = %ld; q = &n = %ld;", a,b,p,q); printf("\n&p = %ld; &q = %ld\n", &p, &q); } Figura 9.3 Programa com aritmtica de endereos

Figura 9.4 Resultado do programa da Figura 9.3

Exemplo 9.1: Escrita do contedo inteiro armazenado num ponteiro


O programa da Figura 9.3 foi usado para gerar o mapa da figura 9.1. Seu resultado aparece na Figura 9.4. Bastou usar os valores dos ponteiros e seus endereos para elaborar tal mapa. Em um programa que usa esse tipo de varivel, o endereo zero de memria considerado de forma muito especial, a ponto de a Linguagem C ter uma constante simblica para ele. a palavra NULL. As seguintes atribuies so equivalentes para o ponteiro int *p:
p = 0;

p = NULL;

Costuma-se dizer, nesse caso que p est aterrado, ou ento que aponta para lugar nenhum (NOTA DA MIRELLA: importante observar que estar aterrado e apontar para lugar nenhum diferente de apontar para o alm!!). diferente de dizer que p est indefinido, pois tal lugar perfeitamente definido. [...]

9.1.2 Acesso ao local apontado por um ponteiro


H uma forma especial de referenciar, num comando executvel qualquer, o local apontado por um ponteiro: colocando nesse comando um asterisco precedendo tal varivel. Ento, se p um ponteiro, *p o local apontado por p. quando a atribuio p = &a; executada, a e *p referencial o mesmo local de memria. Um ponteiro tambm pode ser inicializado como na seguinte declarao.
int a, *p = &a;

Ela deve ser interpretada como: a varivel a do tipo int, a varivel p um ponteiro para esse mesmo tipo e esta ltima inicializada com o endereo da primeira. A seguinte interpretao incorreta: O local apontado por p recebe o endereo de a

Exemplo 9.2: Seja o seguinte fragmento de programa extrado de Kelley [1995]


int a, b = 2, *p; p = &a; *p = 1; b = *p; A figura 9.6 mostra a sequncia de valores recebidos por suas variveis durante a execuo.

Exemplo 9.3: Seja a seguinte declarao


int a = 2, b = 5, *p = &a, *q = &b; A Figura 9.7 mostra os valores das variveis declaradas, no incio e aps a execuo dos dois comandos de atribuio, sendo o segundo executado desconsiderando-se a execuo do primeiro.
Inicialmente: p = &a;

a a

? ?

b b

2 2

p p

p fica definido mas *p ainda no


*p = 1;

*p = 1; equivale a a = 1
b = *p;

b = *p; equivale a b = a Figura 9.6 Sequncia de atribuies com ponteiros do Exemplo 9.2

Inicialmente:

a b

2 5

p q

p = q;

a b

2 5

p q

p recebeu o ponteiro guardado em q, ou seja, o endereo de b; Os valores de *p e *q so ambos iguais a 5, pois p igual a q. Desconsiderando-se a atribuio anterior, com *p = *q;

b 5 q Figura 9.7 Sequncia de atribuies com ponteiros do Exemplo 9.3

Você também pode gostar