Università dell’Insubria
Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese
Corso di Laurea in Informatica
Anno Accademico 2006/07
Laboratorio di Linguaggi
lezione IV
Marco Tarini
Gli array
• simile a java…
/* cartella della tombola, contiene 15 numeri*/
int cartella[15];
deve essere una costante!
(il compil. deve sapere quanti elementi allocare)
• definizione di un nuovo tipo:
typedef int Cartella[15];
• accesso agli elementi…
int main(){
Cartella mia, sua;
mia[2]=31;
}
si usano solo tipi interi per indicizzare. (qui: da 0 a 14)
NB: no range checking !
Segmentation faults sempre in agguato.
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
Gli array: inizializzazione
• Inizializzazione di array (opzionale, come sempre)
int cartella[15]={
10,21,33,13,4,
12,4, 53, 1,78,
2,54,31,86,78,
};
l'ultima virgola è
tollerata
se si inizializza un
int cartella[]={
10,21,33,13,4,
12,4, 53, 1,78,
2,54,31,86,78,
};
Marco Tarini ‧ Laboratorio di Linguaggi ‧
array, allora non è
necessario
specificare il numero
di elementi
(li conta il
compilatore per noi)
2006/07 ‧ Università dell’Insubria
Gli array: inizializzazione
• Inizializzazione di array:
– gli array di caratteri godono di un inizializzatore speciale:
– questa inizializzazione...
char nome[]={'m','a','r','c','o',' ','t','a','r','i','n','i',0};
– ...si può scrivere equivalentemente così:
char nome[]= "marco tarini";
la costante char 0.
Si può scrivere anche
così:
'\0'
nome[ 5]
nome[ 6]
nome[12]
vale
vale
vale
' '
't'
'\0'
Marco Tarini ‧ Laboratorio di Linguaggi ‧
Per convenzione, è
usato come terminatore
delle stringhe:
2006/07 ‧ Università dell’Insubria
Gli array: storaggio
• Importante:
– 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 ‧
2006/07 ‧ Università dell’Insubria
Problema
• Cosa succede, se non si sa a priori quanti
elementi dovremo allocare?
– (a tempo di esecuzione)
• Necessità allocazione dinamica di array.
• Per la soluzione di
questo (e molti altri) problema,
useremo i puntatori
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
E' arrivato il momento de...
I PUNTATORI
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
Puntatori: preambolo
Cosa succede normalmente…
int pippo = 0xA0;
Inoltre, riserva quei
quattro byte per la
variabile pippo.
0x612A0214 00 00 00 FF
0x612A0218 01 22 00 AB
0x612A021C 21 2A 02 2C
0x612A0220 12 23 D2 FF
0x612A0224 FF 02 41 A4
RAM
Ad esempio, la
locazione 0x612A22C
0x00000000
spazio degli indirizzi logici
il compilatore assegna
alla variabile pippo
una locazione di memoria.
0x612A0228 21 00 00 00
0x612A022C 00 00 00 A0
0x612A0230 12 33 A3 D0
0xFFFFFFFF
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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
0x612A0218 01 22 00 AB
0x612A021C 21 2A 02 2C
0x612A0220 12 23 D2 FF
0x612A0224 FF 02 41 A4
RAM
il compilatore assegna
alla variabile pippo
una locazione di memoria.
dopo la complazione
spazio degli indirizzi logici
int pippo = 0xA0;
pippo = 0x00AABB00;
0x612A0228 21 00 00 00
00 BB
00 00
A0
0x612A022C 00 AA
0x612A0230 12 33 A3 D0
0xFFFFFFFF
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
Puntatori: sintassi della dichiarazione
int* pippo;
" pippo " è una var di tipo int*,
cioè di tipo "puntatore ad intero"
o se preferite:
int *pippo;
" *pippo "
(cioè il valore puntato da pippo)
è una espressione di tipo "intero"
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
Puntatori: preambolo
Cosa succede normalmente…
int pippo;
Inoltre, riserva quei
quattro byte per la
variabile pippo.
variabile
pippo
tipo locazione
Inoltre
int 0x612A22C
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.
0x612A0214 00 00 00 FF
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 00
0x612A0230 12 33 A3 D0
0xFFFFFFFF
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
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 0x1223D2FF
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
Considerazione sull'efficienza: assegnamento
(le costanti si assegnano
solo durante l'inizializzazione)
è 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
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
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 )
2006/07 ‧ Università dell’Insubria
Algebra dei Puntatori
• Esempi
double *p, *q;
...
q = p + 3;
*(p + 3)=2.0;
q++;
q--;
q+=2;
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
Algebra dei Puntatori
IDEONA !!
equivalenza
puntatori - vettori
Brain Kernighan
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria
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 ‧
2006/07 ‧ Università dell’Insubria
Algebra dei Puntatori
double *p;
...
p[ 5 ]
equivalente a
*(p + 5)
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2006/07 ‧ Università dell’Insubria