Elementi di Informatica 31 Prof. G. A. Di Lucca - Univ. del Sannio
Variabili di tipo Puntatore
• Le variabili ‘normali’ contengono un valore di un’informazione
cont 128
nome della variabile locazione di memoria
valore della variabile
• Un puntatore è una variabile il cui valore è un indirizzo di memoria
Puntatori
• Un puntatore contiene l’indirizzo di memoria di una variabile che ha uno specifico valore
128 cont
• contptr nome della variabile
puntatore
nome della variabile puntata
valore della variabile
locazione di memoria
Elementi di Informatica 33 Prof. G. A. Di Lucca - Univ. del Sannio
Puntatori nome della variabile
puntatore
nome della variabile puntata
valore della variabile indirizzo di memoria
128 cont
7236 3254
contptr 7236
Puntatori
• I puntatori (pointer) sono “type bound” cioè ad ogni puntatore è associato il tipo della variabile cui il puntatore si riferisce.
• In C, nella dichiarazione di un puntatore bisogna specificare un asterisco (*) davanti al nome della variabile pointer.
• Esempio:
– int *pointer; // puntatore ad una variabile intera
– char *puntcar; // puntatore ad una variabile carattere
– float *fltpnt; // puntatore ad una variabile float
Elementi di Informatica 35 Prof. G. A. Di Lucca - Univ. del Sannio
Inizializzazione di puntatori
• Prima di poter usare un puntatore questo deve essere inizializzato, assegnandogli l’indirizzo di una variabile
• i valori 0 oppure NULL (NULL è preferito) inizializzano un puntatore ad un valore nullo (non puntano a nessuna locazione)
• L’operatore unario & è usato per assegnare l’indirizzo di memoria di una variabile ad un puntatore
• & (address operator)
• fornisce l’indirizzo di una variabile
int y = 5; // dichiara variabile y e le assegna il valore 5 int *yPtr; // dichiara puntatore ad interi yPtr
yPtr = &y; //a yPtr è assegnato l’indirizzo di memoria di y
• yPtr “punta a” y
Inizializzazione e uso di puntatori
yPtr
y
5
yPtr
500000 540000
y
540000 5
L’indirizzo di y è il valore di yPtr
indirizzo di indirizzo di
Elementi di Informatica 37 Prof. G. A. Di Lucca - Univ. del Sannio
• *
(operatore di indirezione o deferimento)– Restituisce un alias o sinonimo di ciò che il suo operando punta – con riferimento all’esempio precedente (yPtr = &y;)
*yPtr riferisce il valore di y (perchè yPtr punta a y) – l’operatore * può essere usato per assegnare un valore alla
variabile puntata
*yptr = 7; // assegna alla variabile y il valore 7
Inizializzazione e uso di puntatori
Inizializzazione e uso di puntatori
Esempio:
int volume;
int *vol_ptr=NULL; // dichiara il puntatore *vol_ptr e lo inizializza a NULL
vol_ptr = &volume; // assegna a *vol_ptr l’indirizzo della variabile intera volume
Il puntatore vol_ptr contiene ora l’indirizzo della variabile volume.
• Si può assegnare un valore all’oggetto puntato da vol_ptr utilizzando l’operatore di indirezione “ * “.
• Eseguendo l’istruzione:
*vol_ptr= 15;
la variabile volume ora contiene il valore 15
Elementi di Informatica 39 Prof. G. A. Di Lucca - Univ. del Sannio
Inizializzazione ed uso di puntatori int volume, *vol_ptr;
// dichiara il puntatore a *vol_ptrvol_ptr = &volume;
// assegna a *vol_ptr l’indirizzo di volume*vol_ptr = 15;
// assegna a volume il valore 15vol_ptr = &volume; ==> vol_ptr = 3221
*vol_ptr= 15; ==> volume = 15
3221 15
Indirizzi memoria
Locazione di memoria assegnata a volume
Locazione di memoria assegnata a vol_ptr
3221
4345
. . .
Memoria
// Esempio di uso degli operatori & e *
#include <stdio.h>
int main()
{ int a; // a variabile di tipo intero
int *aPtr; // aPtr pointer ad una variabile di tipo intero a = 7;
aPtr = &a; // ad aPtr è assegnato l’indirizzo di a printf( “Indirizzo di a = %p”
"\n Valore di aPtr = %p", &a, aPtr );
printf( "\n\n Valore di a = %d"
"\n Valore di *aPtr = %d", a, *aPtr );
L’indirizzo di memoria di a costituisce il valore di aPtr.
L’operatore * restituisce un alias di ciò che punta il suo operando. aPtr punta ad a, quindi *aPtr restituisce a.
Inizializzazione e uso di puntatori
Elementi di Informatica 41 Prof. G. A. Di Lucca - Univ. del Sannio
Indirizzo di a = 0012FF88 Valore di aPtr = 0012FF88
Valore di a = 7
Valore di *aPtr is 7