Elementi di Informatica 32 Prof. G. A. Di Lucca - Univ. del Sannio
Variabili di tipo Puntatore
• Le variabili ‘normali’ (NON puntatore) contengono il valore di un’informazione
area 128
nome della variabile locazione di memoria valore della variabile
• Un puntatore è una variabile il cui valore è un indirizzo di una locazione di memoria
Puntatori
• Un puntatore contiene l’indirizzo della locazione di memoria assegnata ad una variabile (che conterrà i valori di tale variabile).
• Si dice che il puntatore ‘punta’ la variabile allocata a quell’indirizzo
128 area
• areaptr nome della variabile
puntatore nome della variabile
valore della variabile
locazione di memoria
Elementi di Informatica 34 Prof. G. A. Di Lucca - Univ. del Sannio
Puntatori
nome della variabile puntatore
nome della variabile puntata
valore della variabile indirizzo di memoria
128 area
3254 7236
areaptr 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 36 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 memoria di una variabile
• i valori 0 oppure NULL (NULL è preferito) inizializzano un puntatore ad un valore nullo (non puntano a nessuna locazione)
• per assegnare l’indirizzo di memoria di una variabile ad un puntatore è usato l’operatore unario & , address operator
• & (address operator)
• fornisce l’indirizzo di memoria di una variabile
int y = 5; // dichiara la 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 540000
Eseguendo yPtr=&y l’indirizzo di y è assegnato a yPtr
yPtr
500000
y
540000 5
indirizzo di indirizzo di
Elementi di Informatica 38 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 si riferisce il valore di y (perchè yPtr punta a y)
A=*yPtr; // assegna alla variabile A il valore di y, variabile // ‘puntata’ da *Ptr, ovvero A=5
– l’operatore * può essere usato per assegnare un valore alla variabile puntata
*yPtr = 7; // assegna il valore 7 alla variabile ‘puntata’ y
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 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 assegnato il valore 15
Elementi di Informatica 40 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 Fa scrivere il valore 15 nella locazione con indirizzo 3221 assegnata a volume
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 e b variabili di tipo intero
int *aPtr; // aPtr puntatore ad una variabile di tipo intero a = 7;
aPtr = &a; // ad aPtr è assegnato l’indirizzo di a, aPtr ‘punta’ ad a // visualizza indirizzo memoria variabile a e valore di aPtr
printf("\n aPtr = &a; \n");
printf("\n Indirizzo di a (formato decimale) = %d \n", &a);
printf(“ Valore di aPtr (formato decimale) = %d \n", aPtr );
Inizializzazione e uso di puntatori
Elementi di Informatica 42 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 44 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 ora 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 \n", &b);
printf(“ Valore di aPtr (decimale) = %d \n", aPtr );
aPtr ha ora il valore di &b
Elementi di Informatica 46 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