Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2007/08 Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini E' arrivato il momento de... I PUNTATORI Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori: intro • Una tipo variabile che contiene un indirizzo di una locazione di memoria: – l'indirizzo di un'altra variabile! Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori: sintassi della dichiarazione int* pippo; " pippo " è una var di tipo int*, cioè puntatore ad intero o se preferite: int *pippo; " *pippo " (cioè il valore puntato da pippo) è una var di tipo intero Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori: sintassi dell'uso pippo *pippo il valore del puntatore. il valore dell'oggetto puntato. entrambi possono essere sia letti che assegnati (possono comparire da entrambi i lati di un assegnamento) Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori: preambolo Cosa succede normalmente… int pippo = 0xA0; Inoltre, riserva quei quattro byte per la variabile pippo. 0x612A0214 00 00 00 FF m e m o r i a Ad esempio, la locazione 0x612A22C 0x00000000 spazio degli indirizzi logici il compilatore assegna alla variabile pippo una locazione di memoria. 0x612A0218 01 22 00 AB 0x612A021C 21 2A 02 2C 0x612A0220 12 23 D2 FF 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 0x612A022C 00 00 00 A0 0x612A0230 12 33 A3 D0 0xFFFFFFFF Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori: preambolo Cosa succede normalmente… Ad esempio, la locazione 0x612A22C Inoltre, riserva quei quattro byte per la variabile pippo. variabile pippo tipo locazione Inoltre int 0x612A22C STORE 0x0612A22C 0x00AABB00 0x00000000 0x612A0214 00 00 00 FF m e m o r i a il compilatore assegna alla variabile pippo una locazione di memoria. dopo la complazione spazio degli indirizzi logici int pippo = 0xA0; pippo = 0x00AABB00; 0x612A0218 01 22 00 AB 0x612A021C 21 2A 02 2C 0x612A0220 12 23 D2 FF 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 00 BB 00 00 A0 0x612A022C 00 AA 0x612A0230 12 33 A3 D0 0xFFFFFFFF Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori: significato variabile int* pippo; pippo m e m o r i a indirizzo tipo int* locazione 0x612A22C 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 *pippo 0x612A0220 12 23 D2 FF 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 0x612A022C 61 2A 02 1C pippo 0x612A0230 12 33 A3 D0 pippo *pippo (il puntatore stesso) vale... 0x612A021C (la variabile puntata da pippo) vale... 0x000000A0 Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Cambiare il valore del puntatore variabile pippo ++; pippo m e m o r i a indirizzo tipo int* locazione 0x612A22C 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 *pippo 0x612A0220 12 23 D2 FF 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 pippo 1C 0x612A022C 61 2A 02 20 0x612A0230 12 33 A3 D0 pippo *pippo +4 (il puntatore stesso) vale... 0x612A021C (la variabile puntata da pippo) vale... 0x000000A0 Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Cambiare il valore del puntatore variabile pippo++; pippo m e m o r i a indirizzo tipo int* locazione 0x612A22C 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 0x612A0220 12 23 D2 FF *pippo 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 1C 0x612A022C 61 2A 02 20 pippo 0x612A0230 12 33 A3 D0 pippo *pippo (il puntatore stesso) vale... 0x612A021C 0x612A0220 (la variabile puntata da pippo) vale... 0x000000A0 Marco Tarini - Laboratorio di Linguaggi - 0x1223D2FF 2007/08 - Università dell’Insubri Cambiare il valore del valore puntato variabile *pippo = 0x00AABB00; pippo m e m o r i a indirizzo tipo int* locazione 0x612A22C 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 12 AA 23 BB D2 00 FF 0x612A0220 00 *pippo 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 0x612A022C 61 2A 02 20 pippo 0x612A0230 12 33 A3 D0 Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Considerazione sull'efficienza I è una costante intera i è una variabile intera del compilatore int x; ... (vale 10) ip è un puntatore ad un intero tabella dei Simboli const int I=10; int i; int* ip; ide. tipo I i ip x int int int* int locazione o valore --0xAA000000 10 --- 0xBB000000 --- 0xCC000000 --- x = I; compilazione STORE 10 0xCC000000 x = i; compilazione READ STORE TEMP TEMP 0xAA000000 0xCC000000 x = *ip; compilazione READ READ STORE TEMP0 TEMP1 TEMP1 0xBB000000 TEMP0 0xCC000000 Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Considerazione sull'efficienza: assegnamento (le costanti non si assegnano -- casomai si inizializzano) è una costante intera i è una variabile intera (vale 10) ip è un puntatore ad un intero del compilatore int x; ... I tabella dei Simboli const int I=10; int i; int* ip; ide. tipo I i ip x int int int* int locazione o valore --0xAA000000 10 --- 0xBB000000 --- 0xCC000000 --- I = 15; i = 15; compilazione STORE 15 *ip = 15; compilazione READ STORE TEMP 15 Marco Tarini - Laboratorio di Linguaggi - 0xAA000000 0xBB000000 TEMP 2007/08 - Università dell’Insubri Considerazione sull'efficienza: esercizio accessi alla memoria in scrittura accessi alla memoria in lettura a = 15; 1 0 a = b; 1 1 a = *p; 1 2 *p = 15; 1 1 *p = b; 1 2 *p = *p2; 1 3 comando Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Algebra dei Puntatori • L'operazione base sui puntatori: somma con un intero <puntatore ad un tipo T> + <intero> espressione di tipo puntatore ad un tipo T (T*) • Semantica: p + i • è il puntatore che punta una loc. i elementi (di tipo T ) dopo p; • come indirizzo di memoria, è l'indirizzo p + Marco Tarini - Laboratorio di Linguaggi - i x (dimensione diT ) 2007/08 - Università dell’Insubri Algebra dei Puntatori • Esempi double *p, *q; ... q = p + 3; *(p + 3)=2.0; q++; q--; q+=2; Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Algebra dei Puntatori IDEONA !! equivalenza puntatori - vettori Brain Kernighan Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Algebra dei Puntatori • Ripasso: vettori – in memoria, gli elementi di un array sono memorizzati in una serie di celle contigue – ogni cella ha la stessa grandezza – per questo gli array sono random access! int cartella[5]={ 10,21,33,13,4, }; indirizzo base di "cartella" dimensione cella (=4) 10 indirizzo di 21 33 13 4 cartella[3] = (indirizzo base) + 3 x (dimensione cella) cartella[3] Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Algebra dei Puntatori double *p; ... p[ 5 ] equivalente a *(p + 5) Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori e struct typedef struct { char nome[24]; char cognome[24]; int peso; } Persona; Persona *p; ... come accedo al campo peso della Persona puntata da p? Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Puntatori e struct (un pò di zucchero sintattico) typedef struct { char nome[24]; char cognome[24]; int peso; } Persona; Persona *p; ... come accedo al campo peso della Persona puntata da p? *p.peso interpretato come * ( p.peso ) (*p).peso o, equivalentemente, con l'apposito operatore "freccina": p->peso Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Zucchero sintattico typedef struct { char nome[24]; char cognome[24]; int peso; } Persona; typedef struct { char nome[24]; char cognome[24]; int peso; } Persona; void pippo(Persona p) { ... if (p.peso == ... ) ... } void pippo(Persona* p) { ... if (p->peso == ... ) ... } Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri Assegnare i Puntatori • In memoria, un puntatore è un indirizzo di memoria – (...di una variabile) – (...di cui e' noto il tipo) • Bene, ma quale indirizzo? – Modo 1: prendere l'indirizzo di una variabile esistente • il puntatore punterà a quella variabile – Modo 2: allocare (riservare, prenotare) della memoria libera • il puntatore punterà ad una nuova variabile, memorizzata nella memoria così riservata • la nuova variabile è allocata dinamicamente! Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubri