indica que tanto xPtr como yPtr s
ã
o ponteiros para valores de tipo double. Quando o
*
é
usado destamaneira em uma declara
çã
o, ele indica que a vari
á
vel que est
á
sendo declarada
é
um ponteiro. Podemosdeclarar ponteiros para apontar para objetos de qualquer tipo.
Erro comum de programação 5.1
Assumir que o
*
usado para declarar um ponteiro se aplica a todos os nomes de variáveis, em uma lista de variáveis ponteiro separadas por vírgulas, pode fazer com que os ponteiros sejam declarados não como ponteiros. Cada ponteiro deve ser declarado com o
*
prefixado ao nome.
Boa prática
de programação 5.1 Embora não seja obrigatório fazer isso, incluir as letras
Ptr
em nomes de variáveis ponteiro torna claroque estas variáveis são ponteiros e precisam ser manipuladas de acordo.
Os ponteiros deveriam ser inicializados ou quando forem declarados ou em um comando de atribui
çã
o. Umponteiro pode ser inicializado como O, NULL ou um endere
ç
o. Um ponteiro com o valor O ou NULL n
ã
oaponta para nada. NULL
é
uma constante simb
ó
lica definida no arquivo de cabe
ç
alho <iostream> (e emv
á
rios arquivos de cabe
ç
alho da biblioteca padr
ã
o). Inicializar um ponteiro com NTJLL
é
equivalente ainicializar um ponteiro com O. mas, em
c++,
é
prefer
í
vel usar O. Quando
é
usado O, ele
é
convertido emum ponteiro do tipo apropriado. O valor O
é
o
ú
nico valor inteiro que pode ser atribu
í
do diretamente a umavari
á
vel ponteiro sem fazer primeiro a coer
çã
o do inteiro para um tipo de ponteiro. A atribui
çã
o do endere
ç
ode uma vari
á
vel para um ponteiro
é
discutida na Se
çã
o 5.3.
Dica de tes(e e depura ção 5.1
Sempre inicialize ponteiros para evitar apontar para áreas de memória desconhecidas ou não-inicializadas.
322 C++
COMO PROGRAMAR
5.3 Operadores sobre ponteiros
O
&,
ou
operador de endereço,
é um operador unário que retorna o endereço de seu operando. Por exemplo, assumindoas declaraçõesint y
=
5;int
*yptr;
o comandoyPtr
=
atribui o endereço da variável y à variável ponteiro yPtr. Diz-se, então, que a variável yPtr “aponta para” y. A Fig. 5.2mostra uma representação esquemática da memória depois que a atribuição precedente foi executada. Na figura,mostramos a “relação de apontar” desenhando uma seta que vai do ponteiro até o objeto por ele apontado.
Fig. 5.2 Representa
çã
o gr
á
fica de um ponteiro que aponta para uma vari
á
vel inteira na mem
ó
ria.
A Fig. 5.3 mostra a representação do ponteiro na memória, assumindo que a variável de tipo inteiro y está armazenadana posição 600000 e a variável ponteiro yPtr está armazenada na posição 500000. O operando do operador de endereçodeve ser um
ivalue
(i.e., algo ao qual um valor pode ser atribuído, tal como um nome de variável); o operador deendereço não pode ser aplicado para constantes, para expressões que não resultam em referências ou para variáveisdeclaradas com a classe de armazenamento register.
Fig. 5.3 Representa
çã
o de y e yptr na mem
ó
ria.
O
operador
*,
comumente chamado de
operador de indireção
ou
operador de derreferência,
retoma um sinônimo, umnome alternativo ou um apelido para o objeto para qual seu operando (i.e., um ponteiro) aponta. Por exemplo (fazendoreferência à Fig. 5.2 novamente), o comando
cout
«
*yptr
«
eridi;imprime o valor da variável y, isto é, 5, quase do mesmo modo como o comandocout
«
y
«
endJ.;faria. Usar
*
desta maneira é chamado de
derreferenciar um ponteiro.
Note que um ponteiro derreferenciado também pode ser usado do lado esquerdo de um comando de atribuição, como em
*yptr
=
9;
yptr y y
5000001
600000
Leave a Comment