Professional Documents
Culture Documents
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.
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
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. [...]
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
a a
? ?
b b
2 2
p p
*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;