C permite criar caos ou clareza com ponteiros. Depende de como você olha para isso. A linguagem permite que qualquer número de ponteiros aponte exatamente para o mesmo endereço de memória. Isso não é um bug. É um recurso.

Pegue ‘eu’. Declare p, q e r como ponteiros inteiros. Aponte todos eles para i. O código fica assim:

Bastante simples. Mas o que acontece nos bastidores?

Ponteiros são apenas endereços

No exemplo acima, r não aponta para p. Aponta para o que p aponta. Qual é ‘eu’.

Quando você atribui um ponteiro a outro, o endereço é copiado. O valor do lado direito passa para a variável do lado esquerdo. Após a execução, i tem quatro nomes. eu. *p. *q. *r.

Todos são rótulos diferentes para o mesmo pedaço de RAM. Você pode criar quantos ponteiros desejar. O limite é a sua memória, não o idioma.

Por que isso é importante

Esse comportamento altera a forma como você gerencia os dados. Se você passar um ponteiro para uma função, quaisquer alterações feitas através desse ponteiro afetarão a variável original. Se várias funções mantiverem ponteiros para o mesmo endereço, todas elas verão as mesmas alterações.

Ele cria um estado compartilhado. Útil para armazenamento em cache. Perigoso se você perder a noção de quem está escrevendo onde.

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

Essa flexibilidade é poderosa. Também é complicado. Um ponteiro modifica o valor. Todos os outros veem isso imediatamente. Nenhuma sincronização necessária. Apenas acesso à memória bruta.

Pense em depuração. Se uma variável mudar inesperadamente, verifique todos os ponteiros. Qualquer um deles pode ser o culpado. Todos eles têm o mesmo poder. E a mesma responsabilidade.

Não é uma lógica complexa. É uma aritmética simples de ponteiro. Mas as implicações repercutem em todo o seu programa. Um endereço. Muitos nomes. Todos conectados.