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