C permite que você faça algo que pode parecer confuso à primeira vista. Você pode ter vários ponteiros referenciando exatamente o mesmo local de memória. Não é um bug. É um recurso.
Considere esta configuração. Você declara um número inteiro i. Então você declara três ponteiros: p, q e r.
Veja o que acontece aqui. p pega o endereço de i. q faz o mesmo. r não se preocupa com i diretamente. Ele apenas copia qualquer endereço que p esteja segurando. Como p aponta para i, r acaba apontando para i também.
Após a execução dessas linhas, você não terá três variáveis separadas flutuando. Você tem uma variável com quatro aliases.
eu*p*q*r
Eles são todos a mesma coisa.
Isso acontece porque a atribuição do ponteiro é uma cópia do valor do endereço. O endereço do lado direito passa para a variável do lado esquerdo. Nenhuma cópia profunda dos dados ocorre. Apenas o local da memória é transferido.
Não há limite para isso. Você pode encadear quantos ponteiros desejar. uma = b; c=b; d = c; Não importa. Todos eles apontam para o mesmo local na RAM.
Não há limite para o número de ponteiros que podem conter e, portanto, apontar para o mesmo endereço.
Por que isso importa? Isso significa que você pode passar referências livremente. Você pode usar alias de dados para diferentes partes do seu código. Você pode criar estruturas de dados complexas onde os nós fazem referência uns aos outros.
Também significa cautela. Mude *p para 5. O que acontece com eu? Torna-se 5. Alterar *q? i muda novamente. Todos os aliases veem a mesma atualização.
Este é C básico. Mas é poderoso. E é perigoso se você perder a noção de qual ponteiro é qual.








































