Elementi di Informatica 19 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 21 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 23 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 25 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;
alla variabile volume è ora asseganto il valore 15
Elementi di Informatica 27 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,b; // a variabile di tipo intero
int *aPtr; // aPtr puntatore ad una variabile di tipo intero
a = 7;
aPtr = &a; // ad aPtr è assegnato l’indirizzo di a
// visualizza indirizzo memoria variabile a e valore di aPtr printf("\n aPtr = &a; \n");
printf("\n Indirizzo di a (decimale) = %d -- (esadecimale) %p\n", &a, &a);
printf(“ Valore di aPtr (decimale) = %d -- (esadecimale) %p\n", aPtr, aPtr );
Inizializzazione e uso di puntatori
Elementi di Informatica 29 Prof. G. A. Di Lucca - Univ. del Sannio
L’indirizzo di memoria di a costituisce il valore di aPtr.
aPtr ha il valore di &a indirizzo di memoria di a
L’operatore * restituisce un alias di ciò che punta il suo operando: aPtr punta ad a, quindi *aPtr restituisce il valore di a.
Ovvero a e *aPtr hanno lo stesso valore // visualizza valore variabile a e di *aPtr
printf("\n a = 7; \n\n");
printf( " Valore di a = %d\n", a);
printf( " Valore di *aPtr = %d\n\n", *aPtr );
Elementi di Informatica 31 Prof. G. A. Di Lucca - Univ. del Sannio
// assegna ad *aPtr un nuovo valore, che diventa il nuovo valore della // variabile ‘puntata’
*aPtr = 24;
printf("\n *aPtr = 24; \n\n");
printf( " Valore di a = %d\n", a);
printf( " Valore di *aPtr = %d\n\n", *aPtr );
La modifica del valore di *aPtr fa modificare allo stesso modo il valore della variabile ‘puntata’.
a e *aPtr hanno sempre lo stesso valore (modificato)
// facciamo puntare aPtr alla variabile b cui è assegnato il valore 258 aPtr = &b;
b = 258;
printf("\n aPtr = &b; \n");
printf("\n Indirizzo di b (decimale) = %d -- (esadecimale) %p\n", &b, &b);
printf(“ Valore di aPtr (decimale) = %d -- (esadecimale) %p\n", aPtr, aPtr );
aPtr ha ora il valore di &b
Elementi di Informatica 33 Prof. G. A. Di Lucca - Univ. del Sannio
printf("\n b = 258; \n\n");
printf( " Valore di b = %d\n", b);
printf( " Valore di *aPtr = %d\n\n", *aPtr );
*aPtr ha ora il valore della variabile b = 258
*aPtr = 826;
printf("\n *aPtr = 826; \n\n");
printf( " Valore di b = %d\n", b);
printf( " Valore di *aPtr = %d\n\n", *aPtr );
} // fine programma
Modificando il valore di
*aPtr cambia anche il valore della variabile b = 826