C ti consente di creare caos o chiarezza con i puntatori. Dipende da come lo guardi. Il linguaggio consente a qualsiasi numero di puntatori di puntare esattamente allo stesso indirizzo di memoria. Questo non è un bug. È una caratteristica.

Prendi “io”. Dichiara p, q e r come puntatori interi. Puntateli tutti su “i”. Il codice è simile al seguente:

Abbastanza semplice. Ma cosa succede sotto il cofano?

I puntatori sono solo indirizzi

Nell’esempio sopra, “r” non punta a “p”. Indica ciò a cui punta “p”. Che è “io”.

Quando assegni un puntatore a un altro, l’indirizzo viene copiato. Il valore del lato destro si sposta nella variabile del lato sinistro. Dopo l’esecuzione, “i” ha quattro nomi. “io”. “p”. “ q”. “*r”.

Sono tutte etichette diverse per la stessa porzione di RAM. Puoi creare tutti i puntatori che desideri. Il limite è la memoria, non la lingua.

Perché è importante

Questo comportamento cambia il modo in cui gestisci i dati. Se passi un puntatore a una funzione, qualsiasi modifica apportata tramite quel puntatore influenzerà la variabile originale. Se più funzioni contengono puntatori allo stesso indirizzo, tutte vedono le stesse modifiche.

Crea uno stato condiviso. Utile per la memorizzazione nella cache. Pericoloso se si perde traccia di chi scrive e dove.

Non esiste alcun limite al numero di puntatori che possono contenere e puntare allo stesso indirizzo.

Questa flessibilità è potente. È anche complicato. Un puntatore modifica il valore. Tutti gli altri lo vedono subito. Non è necessaria alcuna sincronizzazione. Solo accesso alla memoria grezza.

Pensa al debug. Se una variabile cambia inaspettatamente, controlla tutti i puntatori. Ognuno di loro potrebbe essere il colpevole. Hanno tutti lo stesso potere. E la stessa responsabilità.

Non è una logica complessa. È semplice aritmetica dei puntatori. Ma le implicazioni si ripercuotono sull’intero programma. Un indirizzo. Molti nomi. Tutti connessi.