1. 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
2. Array
● L'array è una struttura dati:
– statica (dimensioni costanti)
– omogenea (formata da elementi dello stesso tipo)
– ad accesso diretto (tempo di accesso costante)
N elementi di tipo T
....
a
0 1 2 3 N-1
Posizione (indice)
Nome Componenti (anonime) della componente
dell'array dell'array
3. Dichiarazione di un array
N elementi di tipo T
....
a
0 1 2 3 N-1
T a[N];
Esempio:
a è un array di N
int a[10]; elementi di tipo T
char s[80]:
double f[100];
4. Es. azzeramento di un array
Parametrizzare sempre la
dimensione
#define N 100
main(){
int i;
int a[N];
for (i = 0; i < N; i++)
a[i]=0;
... Accesso alla componente i-esima;
}
●[ ] sono considerate un operatore di accesso
all'array;
●a[i] è una variabile intera come tutte le altre.
5. 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)
6. 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)
7. Array e puntatori
● E' possibile accedere ad un array con una
doppia notazione:
Notazione ad indice Notazione a puntatore
a[i] = *(a+i)
a[4] = *(a+4)
a[i*j] = *(a+i*j)
a[0] = *a
8. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; Si può usare un puntatore con la
notazione ad indice come se fosse
un array
pa[6] = 8
pa++ ;
*pa = 3;
pa[7]=9;
9. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a ? ? ? ? ? ? ? ? ? ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8
pa++ ;
*pa = 3;
pa[7]=9;
10. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a 4 ? ? ? ? ? ? ? ? ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8
pa++ ;
*pa = 3;
pa[7]=9;
11. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a 4 ? ? 12 ? ? ? ? ? ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8
pa++ ;
*pa = 3;
pa[7]=9;
12. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a 4 ? ? 12 ? ? 8 ? ? ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8;
pa++ ;
*pa = 3;
pa[7]=9;
13. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a 4 ? ? 12 ? ? 8 ? ? ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8;
pa++ ;
*pa = 3;
pa[7]=9;
14. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a 4 3 ? 12 ? ? 8 ? ? ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8;
pa++ ;
*pa = 3;
pa[7]=9;
15. Array e puntatori
● E' possibile accedere ad un array utilizzando un
puntatore:
pa
int a[10], *pa;
pa=a;
*pa=4;
*(pa+3)=12; a 4 3 ? 12 ? ? 8 ? 9 ?
0 1 2 3 4 5 6 7 8 9
pa[6] = 8;
pa++ ;
*pa = 3;
pa[7]=9;
16. Array e puntatori
● E' possibile utilizzare l'identificatore di un array
quasi come se fosse un puntatore
int a[10], *pa; int a[10];
pa=a;
*pa=4; *a=4; E' vietato perchè a è
*(pa+3)=12; *(a+3)=12; considerata una
costante di tipo
puntatore: non esiste
pa[6] = 8 a[6] = 8 una zona di memoria
dedicata a mantenere
pa++ ; a++ ; l'indirizzo di inizio di a
*pa = 3;
pa[7]=9;