Considere as seguintes variáveis e atribuições:
int *p, x;
p = &x;
x = 10;
Qual a relação que se pode estabelecer entre p, *p, &x e x?
int *p, x;
p = &x;
x = 10;
Passo 1
O enunciado fornece as seguintes declarações e atribuições:
A pergunta é: qual a relação entre
,
,
e
?
Informações relevantes dadas:
Informações relevantes dadas:
- Foi declarado
e na mesma linha: com um asterisco (ou seja, é um ponteiro) e como inteiro. - Em seguida foi feito
(atribuição do endereço de a ). - Depois foi feito
(atribuição do valor inteiro a ).
Passo 2
Entendendo a declaração
de forma clara e passo a passo:
- A palavra-chave
indica que estamos a lidar com valores inteiros. - A notação
na declaração significa que é um ponteiro para inteiro; isso quer dizer que a variável não guarda diretamente um número inteiro, mas sim o endereço de memória onde um inteiro está guardado. - A variável
é um inteiro comum, que guarda um valor inteiro (por exemplo, ).
Em resumo:guarda um endereço; guarda um valor inteiro.
Passo 3
O operador
(ampersand) em C significa “endereço de”. Quando eu escrevo
eu estou a pedir o endereço de memória onde a variável
está armazenada. Esse endereço é um valor (um número que aponta uma posição de memória) que pode ser guardado em um ponteiro do tipo apropriado.
Exemplo conceitual: se está no endereço hipotético
, então
.
Exemplo conceitual: se
Passo 4
A linha
faz exatamente isso: pega o endereço de
e armazena esse endereço em
. Logo, depois dessa atribuição vale a igualdade
Isto significa que o conteúdo de
(o número que
guarda) é o endereço de
.
Passo 5
O operador
aplicado a um ponteiro é o operador de desreferência:
significa "o valor inteiro que está armazenado no endereço guardado em
". Como fizemos
, o endereço guardado em
é o endereço de
. Portanto desreferenciar
dá o mesmo que acessar
. Em forma de igualdade:
Isso é um relacionamento fundamental entre ponteiro, desreferência e a variável apontada.
Passo 6
Agora aplicamos a atribuição
. Isso coloca o valor
na célula de memória de
. Como
lê exatamente essa célula (porque
aponta para
), obtemos também
Daqui segue a igualdade em cadeia:
Ou seja, tanto lendo
quanto lendo
obtemos
.
Passo 7
Outras igualdades úteis e propriedades que decorrem das anteriores (úteis para resolver problemas em prova):
- Aplicando
a
recuperamos o ponteiro original: . Isso porque é a variável localizada no endereço guardado em , então o endereço de é justamente o valor guardado em . - Aplicando
a recuperamos : . Isso é a ideia de que pegar o endereço e logo desreferenciar dá o valor original. - Se fizermos uma atribuição via ponteiro, por exemplo
, isso modifica : depois dessa linha teremos (pois e referenciam a mesma célula).