Puntatori

Una variabile puntatore contiene sempre un indirizzo e quindi occupa sempre 2 o 4 byte a seconda del tipo di S.O.

Anche se la variabile puntatore è sempre un numero che corrisponde a un indirizzo, occorre dichiarare il tipo di dato che essa punta, cioè il tipo di dato che si trova nella locazione di memoria puntata.

Se, ad esempio, il puntatore punta una variabile definita come tipo char, il tipo del puntatore è anch'esso char, se punta una variabile float, il tipo del puntatore è float e così via.

Osserviamo le seguenti dichiarazioni:

int dato1,dato2;

char alfa1,alfa2;

char *puntatore1;

float *puntatore2;

in esse vengono dichiarate due variabili come intere, due variabili come caratteri;

le variabile precedute dall'operatore * (asterisco) sono puntatori:

la prima, puntatore1, punta una variabile di tipo carattere,

la seconda, puntatore2, punta una variabile numerica di tipo float, cioè espressa in notazione con virgola mobile.

 

Operatori di puntamento

Un puntatore è l'indirizzo della locazione di una variabile nella memoria.

ESEMPIO:

Immaginiamo di avere una cassettiera con 10 cassetti sovrapposti e di voler inserire nel cassetto 3 i  945 punti che abbiamo raccolto con le merendine. 

L'indirizzo della variabile, cioè il puntatore, è in questo caso il cassetto 3,

mentre il valore della variabile, è in questo caso il numero 945.

Possiamo anche decidere di chiamare la variabile punti_merendine e in questo caso chi tiene in ordine lo schedario ( il compilatore) incolla la targhetta punti _merendine  sul cassetto 3.

E' possibile, allora, individuare la variabile o per mezzo del puntatore (3) o per mezzo del nome della variabile (punti_merendine).

Come abbiamo detto, una variabile puntatore è una variabile che è specificatamente dichiarata per contenere un puntatore.

Proseguendo con l'esempio, possiamo decidere di inserire in un cassetto, su cui metteremo l'etichetta indirizzo, il numero 3.

In tal caso la variabile indirizzo è una variabile puntatore e va dichiarata come tale.

Il linguaggio C ha due operatori specifici per lavorare con i puntatori; essi sono operatori che richiedono un solo operando.

Il primo operatore è & che anteposto, senza alcuno spazio frammezzo, al nome della variabile restituisce l'indirizzo in memoria della variabile.

ESEMPIO 

l'istruzione:

contatore=100;       //assegna alla variabile contatore il valore 100

p=&contatore;       //assegna alla variabile p l'indirizzo della variabile contatore

 

Attenzione! L'indirizzo non è 100, che è invece il valore della variabile.

Nell'esempio sopra riportato avremo:

indirizzo=&puntimerendine;

che nel nostro caso porrebbe nel  cassetto nominato indirizzo il numero 3.

Il secondo operatore, individuato dal simbolo *, restituisce il valore della variabile presente all'indirizzo puntato dalla variabilr puntatore.

La sintassi in C prevede che l'operatore sia anteposto, senza alcuno spazio frammezzo, al nome di una variabile puntatore.

ESEMPIO:

l'istruzione

giorno=*p;

pone nella variabile giorno il valore della variabile contatore puntata dalla variabile p, cioè pone in giorno il valore 100.

Nel caso dell'esempio del cassetto con i punti delle merendine, l'istruzione 

nuovo=*indirizzo;

legge il valore della variabile indirizzo, che è 3, apre allora il cassetto numero 3 e legge il valore 945 (punti) che pone nella variabile nuovo.

Esempio: utilizzo dei puntatori nel linguaggio C

In questo esempio l'istruzione

int *pi;         // dichiara la variabile intera che punta ad un valore di tipo intero mentre l'istruzione 

n1=2;        //assegna il valore 2 alla variabile n1

pi=&n1;   //assegna alla variabile pi l'indirizzo della variabile intera n1 e non il suo valore che in questo caso vale 2

n2=*pi;  //significa che il valore a cui punta pi lo assegno alla variabile n2;

*pi=5;    //nel nostro caso il valore a cui punta pi è 5 e quindi ad n2 viene assegnato il valore 5.

L'output del programma sarà il seguente:

Esercizio: funzioni che utilizzano i puntatori nel linguaggio C

In questo esercizio viene letto dall'esterno un numero intero ad esempio 10 che viene assegnato alla varibile a:

l'istruzione

punt=&a;              // assegna alla variabile punt  l'indirizzo di a 

*punt=*punt+10;  // in questa istruzione il valore che aveva la variabile a cui punta *punt

                           //viene incrementata di 10 e diventa 10+10=20

...

l'istruzione

cubo(&a);    //richiama la funzione cubo e passa l'indirizzo di a alla funzione cubo

                   //che calcola il cubo del valore 10 a cui punta *punt e stampa il risultato.

                  //Dopo la stampa del risultato il programma passa al main ma trovando l'istruzione getch();     

                  //termina il main.

L'output del programma sarà il seguente: