C permite criar uma multidão em torno de um único local de memória. Você não precisa se contentar com uma indicação. Qualquer número de ponteiros pode apontar para o mesmo endereço. Isso não é um bug. É uma característica de como C lida com referências de memória.
Considere uma variável inteira simples i. Você pode declarar três ponteiros distintos: p, q e r. O código é direto.
Veja a última linha. r aponta para a mesma coisa que p aponta. E como p já recebeu o endereço de i, r está efetivamente apontando para i também.
O operador de atribuição copia o endereço do lado direito para o lado esquerdo. Ele não copia o valor armazenado nesse endereço. Ele copia o próprio local. Esta é uma distinção fundamental na aritmética de ponteiros.
Após a execução, i tem quatro nomes. Você pode se referir ao número inteiro como i. Você pode modificá-lo via *p. Você pode lê-lo através de *q. Você também pode acessá-lo usando *r.
Não há limite para quantos ponteiros podem conter o mesmo endereço. Você poderia declarar s, t e u se quisesse. Todos seriam apenas apelidos para o mesmo pedaço de memória.
Essa flexibilidade é importante. Permite que funções compartilhem referências a dados sem copiar grandes estruturas. Ele permite estruturas de dados complexas onde vários nós apontam para o mesmo filho. Torna o gerenciamento de recursos em C mais eficiente.
Mas também introduz riscos. Se um ponteiro modificar o valor, todos os ponteiros verão a alteração. Não há isolamento. Você tem que ter cuidado. Um ponteiro altera o número inteiro. Os outros veem isso imediatamente.
A variável
iagora tem quatro nomes:i,*p,*qe*r.
Esta é a aritmética básica de ponteiros. É fundamental para compreender os modelos de memória C. Mas é também onde as coisas ficam complicadas. Várias referências ao mesmo endereço significam várias maneiras de corromper dados.
Você pode encadear atribuições de ponteiros indefinidamente. s = r; t = s;. Tudo aponta para i. O compilador não se importa. O tempo de execução não importa. São apenas endereços de memória.
Por que isso é importante para os usuários comuns? Se você está escrevendo código C, você confia nisso. Se você estiver depurando uma falha, geralmente esse é o culpado. Erros de uso após liberação prosperam em ambientes onde os ponteiros são reatribuídos, mas não anulados.
A eficiência tem um custo. Complexidade. Você tem que rastrear quem possui os dados. Quem tem permissão para modificá-lo. Com vários ponteiros, esse rastreamento se torna mais difícil.
Mas o poder é inegável. Você pode passar ponteiros para funções. Altere o valor. A variável original reflete a mudança. É assim que C alcança a semântica de referência sem objetos.
É um conceito simples. Copie o endereço. Não copie o valor. Deixe que vários nomes se refiram a um local. Use-o com sabedoria.





























