Por que vários ponteiros podem ter como alvo um endereço em C

11

C permite criar caos ou clareza com a memória. Você pode ter dezenas de ponteiros, todos apontando exatamente para o mesmo local na RAM. Isso não é um bug. É um recurso.

Considere um cenário onde você declara um número inteiro i. Em seguida, você cria três ponteiros inteiros: p, q e r.

O código faz exatamente o que você espera. p pega o endereço de i. q faz o mesmo. r copia tudo o que p está segurando. Como p contém o endereço de i, r também aponta para i.

Após a execução dessas atribuições, você terá uma variável com quatro nomes. i é o original. *p acessa-o. *q acessa-o. *r acessa-o.

Como funciona a atribuição de ponteiro

A chave aqui é entender o que acontece durante a tarefa. Quando você escreve q = &i, você não está copiando o valor de i. Você está copiando o local de i.

Ao escrever r = p, você copia o endereço de p para r. Nenhuma nova memória é alocada. Nenhum dado é duplicado. O valor do endereço passa de uma variável de ponteiro para outra.

Isso significa que não há limite rígido de quantos ponteiros podem conter o mesmo endereço. Você pode criar mil ponteiros, todos apontando para i. Todos eles se referem ao mesmo local de memória.

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

Esse comportamento é fundamental para como C gerencia a memória. Ele permite estruturas de dados flexíveis, como listas vinculadas e árvores. Também permite argumentos de função eficientes. Passe um ponteiro em vez de uma cópia. Modifique os dados originais diretamente.

Mas também introduz riscos. Mude i por p. Veja i até q. A mudança é visível em todos os lugares. Existe apenas uma fonte de verdade.

A variável i agora tem quatro nomes. eu. *p. *q. *r.

É assim que C funciona. Você tem acesso direto aos endereços de memória. Você pode criar nomes de dados livremente. Você só precisa ter cuidado com o que muda.