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?

Passo 1

O enunciado fornece as seguintes declarações e atribuições:
\text{int } *p, x;
p = \&x;
x = 10;
A pergunta é: qual a relação entre p, *p, \&x e x?
Informações relevantes dadas:
  • Foi declarado p e x na mesma linha: p com um asterisco (ou seja, é um ponteiro) e x como inteiro.
  • Em seguida foi feito p = \&x (atribuição do endereço de x a p).
  • Depois foi feito x = 10 (atribuição do valor inteiro 10 a x).

Passo 2

Entendendo a declaração \text{int } *p, x; de forma clara e passo a passo:
  • A palavra-chave \text{int} indica que estamos a lidar com valores inteiros.
  • A notação *p na declaração significa que p é um ponteiro para inteiro; isso quer dizer que a variável p não guarda diretamente um número inteiro, mas sim o endereço de memória onde um inteiro está guardado.
  • A variável x é um inteiro comum, que guarda um valor inteiro (por exemplo, 10).
    Em resumo: p guarda um endereço; x guarda um valor inteiro.

Passo 3

O operador \& (ampersand) em C significa “endereço de”. Quando eu escrevo \&x eu estou a pedir o endereço de memória onde a variável x 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 x está no endereço hipotético 0x100, então \&x = 0x100.

Passo 4

A linha p = \&x; faz exatamente isso: pega o endereço de x e armazena esse endereço em p. Logo, depois dessa atribuição vale a igualdade
p = \&x.
Isto significa que o conteúdo de p (o número que p guarda) é o endereço de x.

Passo 5

O operador * aplicado a um ponteiro é o operador de desreferência: *p significa "o valor inteiro que está armazenado no endereço guardado em p". Como fizemos p = \&x, o endereço guardado em p é o endereço de x. Portanto desreferenciar p dá o mesmo que acessar x. Em forma de igualdade:
*p = x.
Isso é um relacionamento fundamental entre ponteiro, desreferência e a variável apontada.

Passo 6

Agora aplicamos a atribuição x = 10;. Isso coloca o valor 10 na célula de memória de x. Como *p lê exatamente essa célula (porque p aponta para x), obtemos também
*p = 10.
Daqui segue a igualdade em cadeia:
*p = x = 10.
Ou seja, tanto lendo x quanto lendo *p obtemos 10.

Passo 7

Outras igualdades úteis e propriedades que decorrem das anteriores (úteis para resolver problemas em prova):
  • Aplicando & a *p recuperamos o ponteiro original: \&(*p) = p. Isso porque *p é a variável localizada no endereço guardado em p, então o endereço de *p é justamente o valor guardado em p.
  • Aplicando * a \&x recuperamos x: *(\&x) = x. 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 *p = 5;, isso modifica x: depois dessa linha teremos x = 5 (pois *p e x referenciam a mesma célula).

Resposta

p = \&x
*p = x
*p = 10
\&(*p) = p
*(\&x) = x

Exercícios relacionados