laboratorio di linguaggi lezione v: puntatori (1/3) marco tarini università dellinsubria facoltà...
TRANSCRIPT
![Page 1: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/1.jpg)
Laboratorio di Linguaggi
lezione V: puntatori (1/3)
Marco Tarini
Università dell’Insubria
Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese
Corso di Laurea in Informatica
Anno Accademico 2007/08
![Page 2: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/2.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
E' arrivato il momento de...
I PUNTATORI
![Page 3: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/3.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Puntatori: intro
• Una tipo variabile che contiene un indirizzo di una locazione di memoria: – l'indirizzo di un'altra variabile!
![Page 4: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/4.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Puntatori: sintassi della dichiarazione
int* pippo; " pippo " è una var di tipo int*, cioè puntatore ad intero
int *pippo;" *pippo " (cioè il valore puntato da pippo)è una var di tipo intero
o se preferite:
![Page 5: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/5.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Puntatori: sintassi dell'uso
pippo il valore del puntatore.
*pippo il valore dell'oggetto puntato.
entrambi possono essere sia letti che assegnati (possono comparire da entrambi i lati di un assegnamento)
![Page 6: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/6.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Puntatori: preambolo
Cosa succede normalmente…int pippo = 0xA0;
0x00000000
0xFFFFFFFF
il compilatore assegnaalla variabile pippouna locazione di memoria.
Ad esempio, lalocazione 0x612A22C
Inoltre, riserva queiquattro byte per lavariabile pippo.
spazi
o d
eg
li in
dir
izzi
lo
gic
i
0x612A0230
0x612A022C
0x612A0228
0x612A0224
0x612A0220
0x612A021C
0x612A0218
0x612A0214 00 00 00 FF
01 22 00 AB
21 00 00 00
12 23 D2 FF
FF 02 41 A4
21 2A 02 2C
00 00 00 A0
12 33 A3 D0
m e
m
o
r
i a
![Page 7: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/7.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
0x612A0230
0x612A022C
0x612A0228
0x612A0224
0x612A0220
0x612A021C
0x612A0218
0x612A0214 00 00 00 FF
01 22 00 AB
21 00 00 00
12 23 D2 FF
FF 02 41 A4
21 2A 02 2C
00 00 00 A0
12 33 A3 D0
m e
m
o
r
i a
Puntatori: preambolo
Cosa succede normalmente…int pippo = 0xA0;pippo = 0x00AABB00;
0x00000000
0xFFFFFFFF
il compilatore assegnaalla variabile pippouna locazione di memoria.
Ad esempio, lalocazione 0x612A22C
Inoltre, riserva queiquattro byte per lavariabile pippo.
spazi
o d
eg
li in
dir
izzi
lo
gic
i
Inoltrevariabile tipo locazione
pippo int 0x612A22C
dopo la complazione STORE 0x0612A22C 0x00AABB00
00 AA BB 00
![Page 8: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/8.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Puntatori: significato
int* pippo;
0x612A0230
0x612A022C
0x612A0228
0x612A0224
0x612A0220
0x612A021C
0x612A0218
0x612A0214 00 00 00 FF
01 22 00 AB
21 00 00 00
12 23 D2 FF
FF 02 41 A4
61 2A 02 1C
00 00 00 A0
12 33 A3 D0
variabile tipo locazione
pippo int* 0x612A22Cindirizzo
pippo
*pippo
pippo
*pippo
m e
m
o
r
i a
(il puntatore stesso) vale...
(la variabile puntata da pippo) vale...
0x612A021C
0x000000A0
![Page 9: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/9.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiare il valore del puntatore
pippo ;
0x612A0230
0x612A022C
0x612A0228
0x612A0224
0x612A0220
0x612A021C
0x612A0218
0x612A0214 00 00 00 FF
01 22 00 AB
21 00 00 00
12 23 D2 FF
FF 02 41 A4
61 2A 02 1C
00 00 00 A0
12 33 A3 D0
variabile tipo locazione
pippo int* 0x612A22Cindirizzo
*pippo
pippo
+4
61 2A 02 20
pippo
*pippo
m e
m
o
r
i a
++
(il puntatore stesso) vale...
(la variabile puntata da pippo) vale...
0x612A021C
0x000000A0
![Page 10: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/10.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiare il valore del puntatore
pippo++;
0x612A0230
0x612A022C
0x612A0228
0x612A0224
0x612A0220
0x612A021C
0x612A0218
0x612A0214 00 00 00 FF
01 22 00 AB
21 00 00 00
12 23 D2 FF
FF 02 41 A4
61 2A 02 1C
00 00 00 A0
12 33 A3 D0
variabile tipo locazione
pippo int* 0x612A22Cindirizzo
*pippo
pippo61 2A 02 20
pippo
*pippo
0x612A0220
0x1223D2FF
m e
m
o
r
i a
(il puntatore stesso) vale...
(la variabile puntata da pippo) vale...
0x612A021C
0x000000A0
![Page 11: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/11.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Cambiare il valore del valore puntato
*pippo = 0x00AABB00;
0x612A0230
0x612A022C
0x612A0228
0x612A0224
0x612A0220
0x612A021C
0x612A0218
0x612A0214 00 00 00 FF
01 22 00 AB
21 00 00 00
12 23 D2 FF
FF 02 41 A4
00 00 00 A0
12 33 A3 D0
variabile tipo locazione
pippo int* 0x612A22Cindirizzo
*pippo
pippo61 2A 02 20
00 AA BB 00
m e
m
o
r
i a
![Page 12: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/12.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
I è una costante intera (vale 10)
i è una variabile intera
ip è un puntatore ad un intero
Considerazione sull'efficienza
const int I=10; int i;int* ip;
STORE 10 0xCC000000
int x; ...
x = I;
x = i;
x = *ip;
READ TEMP 0xAA000000 STORE TEMP 0xCC000000
compilazione
compilazione
compilazione READ TEMP0 0xBB000000 READ TEMP1 TEMP0STORE TEMP1 0xCC000000
ide. tipo locazione o
I int 10
valore
iip
intint*
---
0xBB000000
0xCC000000
0xAA000000 ---
---
---x int
tabella
dei Sim
boli
del co
mpila
tore
![Page 13: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/13.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
I è una costante intera (vale 10)
i è una variabile intera
ip è un puntatore ad un intero
Considerazione sull'efficienza: assegnamento
const int I=10; int i;int* ip;
int x; ...
I = 15;
i = 15;
*ip = 15;
STORE 15 0xAA000000 compilazione
compilazione READ TEMP 0xBB000000 STORE 15 TEMP
ide. tipo locazione o
I int 10
valore
iip
intint*
---
0xBB000000
0xCC000000
0xAA000000 ---
---
---x int
tabella
dei Sim
boli
del co
mpila
tore
(le costanti non si assegnano -- casomai si inizializzano)
![Page 14: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/14.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Considerazione sull'efficienza: esercizio
a = *p;
a = b;
a = 15;
*p = 15;
*p = b;
*p = *p2;
accessi alla memoriain scrittura
accessi alla memoriain lettura
comando
1
1
1
1
1
1
0
1
2
1
2
3
![Page 15: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/15.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
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:
• è il puntatore che punta una loc. i elementi (di tipo T ) dopo p;
• come indirizzo di memoria, è l'indirizzo p + i x (dimensione diT )
p + i
![Page 16: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/16.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Algebra dei Puntatori
• Esempi
double *p, *q;...q = p + 3;*(p + 3)=2.0;q++;q--;q+=2;
![Page 17: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/17.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Algebra dei Puntatori
IDEONA !!equivalenza
puntatori - vettori
Brain Kernighan
![Page 18: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/18.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
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,};
10
indirizzobase
di "cartella"
21 33 13 4
indirizzo di cartella[3] = (indirizzo base) + 3 x (dimensione cella)cartella[3]
dimensionecella (=4)
![Page 19: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/19.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Algebra dei Puntatori
equivalente a
double *p;...
p[ 5 ]
*(p + 5)
![Page 20: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/20.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
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?
![Page 21: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/21.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Puntatori e struct (un pò di zucchero sintattico)
typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;
Persona *p;
...
*p.peso
come accedo al campo peso della Persona puntata da p?
(*p).peso
p->peso
o, equivalentemente, con l'apposito operatore "freccina":
p.peso* ( )interpretato
come
![Page 22: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/22.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
Zucchero sintattico
typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;
void pippo(Persona p) { ... if (p.peso == ... ) ...}
typedef struct { char nome[24]; char cognome[24]; int peso;} Persona;
void pippo(Persona* p) { ... if (p->peso == ... ) ...}
![Page 23: Laboratorio di Linguaggi lezione V: puntatori (1/3) Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso](https://reader036.vdocumenti.com/reader036/viewer/2022062404/5542eb50497959361e8c00d7/html5/thumbnails/23.jpg)
M a r c o T a r i n i - L a b o r a t o r i o d i L i n g u a g g i - 2 0 0 7 / 0 8 - U n i v e r s i t à d e l l ’ I n s u b r i a
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!