Home/post/C - Puntatori
Andrea Falla

Andrea Falla

17

08 Apr, 2022

C - Puntatori

C - Puntatori

Un puntatore è una variabile che rappresenta la locazione in memoria di un dato valore, tant'è che il contenuto di questo particolare genere di variabile è un indirizzo di memoria. Esso ci permette di muoverci in tutta libertà nella memoria, anche accedendo ad aree riservate, percui è importante prestare attenzione al suo utilizzo. ⁠L'operatore che contraddistingue variabili contenenti indirizzi è l'asterisco (*).

1
void main(){
2
int *p; // dichiarazione puntatore ad intero
3
int x; // dichiarazione intero
4
p = &x; // inizializzazione puntatore che punta al valore di x
5
}

⁠Come reso dall'esempio, l'operatore che permette di sfruttare l'indirizzo di una variabile è la e commerciale (&).

Al momento della dichiarazione del puntatore il tipo che gli assegnamo corrisponde al tipo di variabili che può puntare, questo perché in C ogni variabile occupa uno spazio di memoria differente. Grazie a questa proprietà dei puntatori possiamo applicare delle espressioni aritmetiche per spostarci in memoria, con alcune accortezze:

1
void main(){
2
int *p;
3
int v[3]; // vettore a tre elementi (interi)
4
p = v; // p = v[0]
5
// il nome di un vettore indica di persé, quindi non serve l'operatore &
6
7
// effettuo lo spostamento all'elemento successivo dell'array
8
p++; // p = v[1];
9
}

È bene spiegare alcune cose dell'esempio appena visto. ⁠Spostarsi di un elemento avanti in memoria, in un certo senso alla variabile successiva, richiede di muoversi in avanti di tanti byte, quanto è grande la variabile, tant'è che se abbiamo un vettore di int (come sopra) serve spostarsi di 4 byte, in caso di un vettore di float serve spostarsi di 8 byte, ecc... ⁠Per questo motivo, scrivere p = p + 1; incrementa l'indirizzo contenuto in p, ma non è detto che a quell'indirizzo sia già presente l'elemento successivo, come in una stringa, dunque è bene utilizzare questa espressione: p++; (interpretabile come vai all'elemento successivo).

Per operare sull'indirizzo contenuto nel puntatore è necessiario trattarlo come una comune variabile, mentre per operare sul contenuto della cella puntata dal puntatore serve utilizzare l'asterisco (*) davanti al nome della variabile:

1
void main(){
2
int x = 3;
3
int y;
4
int *p;
5
6
p = &x; // dentro p ora è presente l'indirizzo di x
7
8
y = *p; // dentro y ora è presente il valore di ciò che è puntato da p, ossia il valore di x, ossia 3
9
10
printf("Contenuto di y: %d\n",y);
11
printf("Indirizzo di x: %p\n",&x);
12
printf("Indirizzo contenuto in p: %p\n", p);
13
/*
14
Output:
15
Contenuto di y: 3
16
Indirizzo di x: 0x7ffc485d1ec8
17
Indirizzo contenuto in p: 0x7ffc485d1ec8
18
*/
19
}

Per chiudere, un puntatore è una variabile che contiene l'indirizzo di una cella di memoria e l'operatore che lo contraddistringue è l'asterisco. Ciò che serve per assegnare un indirizzo di una variabile al puntatore è l'operatore &, mentre per accedere al contenuto della cella puntata dal puntatore è necessario sempre l'asterisco. Funzionalmente molto più comodo, poiché semplifica la gestione di aree di memoria ampie senza necessitare di indici di posizione che occupano spazio e tempo di esecuzione.

Andrea Falla

Andrea Falla

Sono uno studente delle superiori. Ho approcciato l'informatica con la scuola, mentre la scrittura è una passione nata con il tempo.

Lascia un commento