prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Si è avuto modo di conoscere l’operatore & (indirizzo di) utilizzato nella scanf per indicare che l’input deve essere conservato all’indirizzo di memoria corrispondente alla variabile specificata. L’operatore * è il secondo operatore utilizzato per la manipolazione di indirizzi di memoria: è utilizzato per specificare un puntatore.
Un puntatore è una variabile che contiene un indirizzo di memoria. Un puntatore è quindi una variabile che non contiene dati ma l’indirizzo dei dati. Una variabile per poter essere utilizzata come puntatore è necessario che sia dichiarata come tale. Si consideri il frammento di programma successivo:
... int *x, *y; /*1*/ int a,b,c; /*2*/ ... a = 10; /*3*/ c = a; /*4*/ x = &a; /*5*/ y = x; /*6*/ *x = 20; /*7*/ b = a; /*8*/ ...
Nella 1 vengono dichiarati due puntatori ad interi. Con tale terminologia si vuole intendere che tali variabili (x e y) conterranno ognuna il primo indirizzo di una quantità di locazioni di memoria tali da poter contenere un dato del tipo specificato.
Nella 3, come noto, si assegna il valore 10 alla variabile a dichiarata nella 2.
Nella 5 si assegna ad x l’indirizzo di a. Si noti il fatto che, essendo stato x dichiarato puntatore, l’unica cosa che può ricevere correttamente è un indirizzo: sarebbe errore assegnare ad x il valore di a. Questa assegnazione, in pratica, crea un nuovo riferimento alla stessa zona di memoria (quella identificata dalla variabile a). Si noti la differenza con l’assegnazione effettuata nella 4. L’assegnazione della 4 duplica in c l’attuale valore conservato in a: si può modificare il valore contenuto in c senza che ciò comporti alcunché per a (sono variabili diverse). Nella 5, invece, x rappresenta un nuovo riferimento alla stessa zona di memoria: modificando il contenuto della zona di memoria interessata da x si modifica il contenuto della zona di memoria associata al simbolo a.
L’assegnazione della 6 è pienamente legittima: x e y sono entrambi puntatori. Da questo momento anche y sarà un riferimento alla stessa area di memoria di a.
L’assegnazione della 7 si legge: nella locazione puntata da x mettiamo il valore 20. In definitiva si sta variando il contenuto della variabile a. Si sottolinea la differenza di significato con la 6. Ovviamente poteva essere assegnato, oltre che un valore costante, il valore contenuto in una variabile. Si noti che, affinché sia possibile effettuare una simile assegnazione, è indispensabile che il puntatore sia stato inizializzato: nell’esempio tale operazione è effettuata nella 5.
La 8 è una comune assegnazione solo che b, a differenza di c nella 4, riceve il valore modificato di a (modifica effettuata in conseguenza di 5 e 7).
Il linguaggio C fa un uso intensivo dei puntatori. Si tratta di uno strumento fra i più potenti ma anche delicati: un uso improprio di puntatori può portare a gravi guasti del sistema o a errori difficili da identificare. In ogni caso rappresenta uno dei punti di forza del linguaggio C ed è bene acquisire comprensione e padronanza di tale strumento.
http://ennebi.solira.org | ennebi@solira.org |