Lezione 12 (28 marzo 2012) puntatori vettori

16

Click here to load reader

Transcript of Lezione 12 (28 marzo 2012) puntatori vettori

Page 1: 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

Page 2: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 3: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 4: Lezione 12 (28 marzo 2012) puntatori   vettori

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.

Page 5: Lezione 12 (28 marzo 2012) puntatori   vettori

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)

Page 6: Lezione 12 (28 marzo 2012) puntatori   vettori

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)

Page 7: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 8: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 9: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 10: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 11: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 12: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 13: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 14: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 15: Lezione 12 (28 marzo 2012) puntatori   vettori

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

Page 16: Lezione 12 (28 marzo 2012) puntatori   vettori

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