Puntatori in C
Vediamo ora come questi concetti studiati in teoria si applicano alla programmazione.
Immaginiamo il seguente codice.
#include <stdio.h>
int main() {
int a = 4;
printf ("Il valore di a è %d\n",a);
return 0;
}
Il valore di a è 4
È possibile sapere in quale indirizzo di memoria è situata la variabile a
?
La risposta è sì, ed è possibile farlo attraverso l'operatore &
, che serve esattamente per sapere l'indirizzo di una variabile.
Operatore & (indirizzo di)
L'operatore &
si legge "e commerciale" (oppure in inglese "ampersand" o ancora "operatore di referenziazione") e serve esattamente per sapere l'indirizzo di una variabile.
#include <stdio.h>
int main() {
int a = 4;
printf ("Il valore di a è %d\n",a);
printf ("L'indirizzo di a è %p\n",&a);
return 0;
}
Il valore di a è 4
L'indirizzo di a è 0x7ffc18dc19cc
Possiamo immaginare il simbolo & come un nodo a cui è legato il filo alla cui estremità opposta c'è la variabile.
Se volessimo invece sapere il valore di un indirizzo di memoria? Esiste anche un operatore per questo scopo, che è l'operatore *
.
Operatore * (indirizzamento indiretto)
L'operatore *
si legge "stella" (oppure in inglese "star" o ancora operatore di "dereferenziazione" o "indirezione") serve per conoscere il valore di un certo indirizzo di memoria.
Le variabili che memorizzano al loro interno un indirizzo di memoria si chiamano puntatori.
Vediamo un esempio di codice in cui dichiariamo un puntatore, gli assegniamo l'indirizzo di 'a' e ne stampiamo sia il valore, sia il valore puntato.
#include <stdio.h>
int main() {
int a = 4;
int* p = &a;
printf ("Il valore di a è %d\n",a);
printf ("L'indirizzo di a è %p\n",&a);
printf ("Il valore di p è %p\n",p);
printf ("Il valore puntato da p è %d\n",*p);
return 0;
}
Il valore di a è 4
L'indirizzo di a è 0x7ffe344c8874
Il valore di p è 0x7ffe344c8874
Il valore puntato da p è 4
Potete sperimentare anche voi con questo esempio a questo link.
Potete inoltre visualizzare graficamente il comportamento dei puntatori con il seguente strumento. Cliccate next per vedere come si comporta la memoria in fase di esecuzione.