C Pointers: Por que múltiplas variáveis compartilham o mesmo endereço de memória

2

Em C, você pode ter vários ponteiros, todos direcionados exatamente ao mesmo local de memória. Não é um bug. É um recurso.

Você pode declarar três ponteiros inteiros: p, q e r. Então você pode configurá-los todos para apontar para a mesma variável inteira i.

Veja o que acontece aqui. p obtém o endereço de i. q também obtém o endereço de i. r obtém tudo o que p está segurando. Esse é o endereço de i.

Depois que esse código for executado, você terá uma situação estranha. i agora tem quatro nomes. Você pode acessá-lo usando i, *p, *q ou *r. Todos eles se referem ao mesmo local na RAM.

Como funciona a atribuição de ponteiro

Ao atribuir um ponteiro a outro, você não está copiando o valor para o qual eles apontam. Você está copiando o endereço.

r = p não copia o inteiro i. Ele copia o endereço de memória armazenado em p. Como p contém o endereço de i, r agora também contém o endereço de i.

Não há limite para quantos ponteiros podem compartilhar um endereço. Você poderia ter dez dicas. Ou cem. Todos eles apenas apontam para a mesma coisa.

Por que isso é importante

Esse comportamento muda a forma como você pensa sobre os dados. Uma única variável na memória pode ter muitos aliases. Se você alterar o valor por meio de um ponteiro, todos os outros ponteiros verão a alteração.

Agora i é 10. *q é 10. *r é 10. Todos estão olhando para os mesmos dados.

Isso é útil. Permite passar referências para funções sem copiar grandes estruturas. Ele permite que diferentes partes do seu código operem com os mesmos dados. Mas também significa que você precisa ter cuidado. Alterar um ponteiro pode afetar outros.

Equívocos comuns

Alguns iniciantes pensam que a atribuição de ponteiros copia os dados. Isso não acontece. Ele copia o endereço.

Outros se perguntam se existe um limite. Não há nenhum. A linguagem permite criar quantos ponteiros você precisar. O compilador não o impede.

O resultado final

Vários ponteiros podem apontar para o mesmo endereço. Este é o comportamento padrão do C. Você pode atribuir ponteiros entre si. O endereço é copiado, não o valor. A variável permanece a mesma. Os nomes simplesmente se multiplicam.

“Não há limite para o número de ponteiros que podem conter (e, portanto, apontar para) o mesmo endereço.”

Essa flexibilidade é poderosa. Requer disciplina. Mas é fundamental para o funcionamento de C. Se você entende isso, entende um conceito central de gerenciamento de memória em C.