Lezione 12 (28 marzo 2012) puntatori vettori
Click here to load reader
Transcript of Lezione 12 (28 marzo 2012) puntatori vettori
Array
● Se vogliamo risolvere il seguente problema:
leggere n numeri e stamparli ordinati
ci accorgiamo che è necessario avere tutti i numeri a disposizione per poter effettuare confronti e scambi fra di loro.
● E' necessario avere una struttura dati che li possa contenere
● Tale struttura è l'ARRAY
Array● L'array è una struttura dati:
– statica (dimensioni costanti)
– omogenea (formata da elementi dello stesso tipo)
– ad accesso diretto (tempo di accesso costante)
0 1 2 3
....
N-1
N elementi di tipo T
a
Nome dell'array
Componenti (anonime) dell'array
Posizione (indice) della componente
Dichiarazione di un array
0 1 2 3
....
N-1
N elementi di tipo T
a
T a[N]; Esempio:
int a[10];char s[80]:double f[100];
a è un array di N elementi di tipo T
Es. azzeramento di un array
#define N 100
main(){int i;int a[N];
for (i = 0; i < N; i++)a[i]=0;
...}
Parametrizzare sempre la dimensione
Accesso alla componente i-esima;
●[ ] sono considerate un operatore di accesso all'array;●a[i] è una variabile intera come tutte le altre.
Allocazione dell'array in memoria
● Nel linguagio C gli array sono allocati in locazioni successive della memoria.
● L'accesso alla componente i-esima avviene sommando all'indirizzo iniziale dell'array il prodotto tra i e la dimensione del tipo T.– Es. l'indirizzo della terza componente di un array di
interi allocato a partire dall'indirizzo 100 sarà 100 + 2*4 = 108 (supposto int di 4 byte)
Array e puntatori
● L'identificatore di un array viene trattato come una costante di tipo puntatore, ovvero ha il significato dell'indirizzo della prima componente dell'array
a = &a[0]● Sfruttando l'aritmetica dei puntatori questo
significa che
&a[i] = a + i
a[i] = *(a + i)
Array e puntatori
● E' possibile accedere ad un array con una doppia notazione:
Notazione ad indicea[i]a[4]
a[i*j]a[0]
====
Notazione a puntatore*(a+i)*(a+4)*(a+i*j)*a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8pa++ ;*pa = 3;pa[7]=9;
Si può usare un puntatore con la notazione ad indice come se fosse
un array
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8pa++ ;*pa = 3;pa[7]=9;
pa
?
0
?
1
?
2
?
3
?
8
?
4
?
5
?
6
?
7
?
9
a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8pa++ ;*pa = 3;pa[7]=9;
pa
4
0
?
1
?
2
?
3
?
8
?
4
?
5
?
6
?
7
?
9
a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8pa++ ;*pa = 3;pa[7]=9;
pa
4
0
?
1
?
2
12
3
?
8
?
4
?
5
?
6
?
7
?
9
a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8;pa++ ;*pa = 3;pa[7]=9;
pa
4
0
?
1
?
2
12
3
?
8
?
4
?
5
8
6
?
7
?
9
a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8;pa++ ;*pa = 3;pa[7]=9;
pa
4
0
?
1
?
2
12
3
?
8
?
4
?
5
8
6
?
7
?
9
a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8;pa++ ;*pa = 3;pa[7]=9;
pa
4
0
3
1
?
2
12
3
?
8
?
4
?
5
8
6
?
7
?
9
a
Array e puntatori
● E' possibile accedere ad un array utilizzando un puntatore:
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8;pa++ ;*pa = 3;pa[7]=9;
pa
4
0
3
1
?
2
12
3
9
8
?
4
?
5
8
6
?
7
?
9
a
Array e puntatori
● E' possibile utilizzare l'identificatore di un array quasi come se fosse un puntatore
int a[10], *pa;pa=a;*pa=4;*(pa+3)=12;
pa[6] = 8pa++ ;*pa = 3;pa[7]=9;
int a[10];
*a=4;*(a+3)=12;
a[6] = 8a++ ;
E' vietato perchè a è considerata una costante di tipo
puntatore: non esiste una zona di memoria dedicata a mantenere l'indirizzo di inizio di a