1 / 28

Laboratorio di Linguaggi lezione IV

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. si usano solo tipi interi per indicizzare. (qui: da 0 a 14)

haviva-ross
Download Presentation

Laboratorio di Linguaggi lezione IV

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Laboratorio di Linguaggilezione IV Marco Tarini

  2. Gli array si usano solo tipi interi per indicizzare. (qui: da 0 a 14) NB: no range checking ! Segmentation faults sempre in agguato. • simile a java… • definizione di un nuovo tipo: • accesso agli elementi… /* cartella della tombola, contiene 15 numeri*/ int cartella[15]; deve essere una costante! (il compil. deve sapere quanti elementi allocare) typedef int Cartella[15]; int main(){ Cartella mia, sua; mia[2]=31; } M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  3. 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 array, allora non è necessario specificare il numero di elementi (li conta il compilatore per noi) int cartella[]={ 10,21,33,13,4, 12,4, 53, 1,78, 2,54,31,86,78, }; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  4. Gli array: inizializzazione la costante char 0. Si può scrivere anche così: Per convenzione, è usato come terminatore delle stringhe: '\0' nome[ 5] nome[ 6] nome[12] vale vale vale • Inizializzazione di array: • gli array di caratteri godono di un inizializzatore speciale: • questa inizializzazione... • ...si può scrivere equivalentemente così: char nome[]={'m','a','r','c','o',' ','t','a','r','i','n','i',0}; char nome[]= "marco tarini"; ' ' 't' '\0' M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  5. Gli array: storaggio cartella[3] indirizzo dicartella[3]= (indirizzo base) + 3x(dimensione cella) • 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 21 33 13 4 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  6. 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  7. E' arrivato il momento de... I PUNTATORI M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  8. Puntatori: intro • Una tipo variabile che contiene un indirizzo di una locazione di memoria: • l'indirizzo di un'altra variabile! M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  9. Puntatori: sintassi della dichiarazione " pippo " è una var di tipo int*, cioè puntatore ad intero int*pippo; o se preferite: " *pippo " (cioè il valore puntato da pippo)è una var di tipo intero int *pippo; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  10. Puntatori: sintassi dell'uso pippo il valore del puntatore. *pippo il valore dell'oggetto puntato. entrambi possono essere sia letti che assegnati (possono comparire da entrambi i lati di un assegnamento) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  11. Puntatori: preambolo 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 A0 0x612A0230 12 33 A3 D0 Cosa succede normalmente… int pippo = 0xA0; il compilatore assegna alla variabile pippo una locazione di memoria. Ad esempio, la locazione 0x612A22C Inoltre, riserva quei quattro byte per la variabile pippo. 0x00000000 spazio degli indirizzi logici R A M 0xFFFFFFFF M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  12. Puntatori: preambolo dopo la complazione STORE 0x0612A22C 0x00AABB00 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 A0 0x612A0230 12 33 A3 D0 Inoltre variabile tipo locazione 00 AA BB 00 pippo int 0x612A22C Cosa succede normalmente… int pippo = 0xA0; pippo = 0x00AABB00; il compilatore assegna alla variabile pippo una locazione di memoria. Ad esempio, la locazione 0x612A22C Inoltre, riserva quei quattro byte per la variabile pippo. 0x00000000 spazio degli indirizzi logici R A M 0xFFFFFFFF M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  13. Puntatori: intro • Una tipo variabile che contiene un indirizzo di una locazione di memoria: • l'indirizzo di un'altra variabile! M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  14. Puntatori: sintassi della dichiarazione " pippo " è una var di tipo int*, cioè di tipo "puntatore ad intero" int*pippo; o se preferite: " *pippo " (cioè il valore puntato da pippo)è una espressione di tipo "intero" int *pippo; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  15. Puntatori: sintassi dell'uso pippo il valore del puntatore. *pippo il valore dell'oggetto puntato. entrambi possono essere sia letti che assegnati (possono comparire da entrambi i lati di un assegnamento) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  16. Puntatori: preambolo 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 Inoltre variabile tipo locazione pippo int 0x612A22C Cosa succede normalmente… int pippo; il compilatore assegna alla variabile pippo una locazione di memoria. Ad esempio, la locazione 0x612A22C Inoltre, riserva quei quattro byte per la variabile pippo. 0x00000000 spazio degli indirizzi logici m e m o r i a 0xFFFFFFFF M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  17. Puntatori: significato (il puntatore stesso) vale... 0x612A021C (la variabilepuntata da pippo) vale... 0x000000A0 int*pippo; variabile tipo locazione pippo int* 0x612A22C indirizzo 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 *pippo 0x612A0220 12 23 D2 FF m e m o r i a 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 pippo 0x612A022C 61 2A 02 1C 0x612A0230 12 33 A3 D0 pippo (il puntatore stesso) vale... *pippo (la variabilepuntata da pippo) vale... M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  18. Cambiare il valore del puntatore +4 (il puntatore stesso) vale... 0x612A021C 61 2A 02 20 (la variabilepuntata da pippo) vale... 0x000000A0 pippo++; variabile tipo locazione pippo int* 0x612A22C indirizzo 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 *pippo 0x612A0220 12 23 D2 FF m e m o r i a 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 pippo 0x612A022C 61 2A 02 1C 0x612A0230 12 33 A3 D0 pippo *pippo M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  19. Cambiare il valore del puntatore (il puntatore stesso) vale... 0x612A021C 61 2A 02 20 (la variabilepuntata da pippo) vale... 0x000000A0 pippo++; variabile tipo locazione pippo int* 0x612A22C indirizzo 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 *pippo 0x612A0220 12 23 D2 FF m e m o r i a 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 pippo 0x612A022C 61 2A 02 1C 0x612A0230 12 33 A3 D0 pippo 0x612A0220 0x1223D2FF *pippo M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  20. Cambiare il valore del valorepuntato 00 AA BB 00 *pippo = 0x00AABB00; variabile tipo locazione pippo int* 0x612A22C indirizzo 0x612A0214 00 00 00 FF 0x612A0218 01 22 00 AB 0x612A021C 00 00 00 A0 *pippo 0x612A0220 12 23 D2 FF m e m o r i a 0x612A0224 FF 02 41 A4 0x612A0228 21 00 00 00 pippo 0x612A022C 61 2A 02 20 0x612A0230 12 33 A3 D0 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  21. Considerazione sull'efficienza ide. tipo locazione o valore int --- 10 I tabella dei Simboli del compilatore --- i int 0xAA000000 --- ip int* 0xBB000000 --- x 0xCC000000 int compilazione compilazione compilazione I è una costante intera (vale 10) i è una variabile intera ip è un puntatore ad un intero const int I=10; int i; int*ip; int x; ... x = I; STORE 10 0xCC000000 READ TEMP 0xAA000000 STORE TEMP 0xCC000000 x = i; READ TEMP0 0xBB000000 READ TEMP1 TEMP0 STORE TEMP1 0xCC000000 x = *ip; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  22. Considerazione sull'efficienza: assegnamento ide. tipo locazione o valore int --- 10 I tabella dei Simboli del compilatore --- i int 0xAA000000 --- ip int* 0xBB000000 (le costanti si assegnano solo durante l'inizializzazione) --- x 0xCC000000 int compilazione compilazione I è una costante intera (vale 10) i è una variabile intera ip è un puntatore ad un intero const int I=10; int i; int*ip; int x; ... I = 15; i = 15; STORE 15 0xAA000000 READ TEMP 0xBB000000 STORE 15 TEMP *ip = 15; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  23. Considerazione sull'efficienza: esercizio accessi alla memoria in scrittura accessi alla memoria in lettura comando 1 1 1 1 1 1 0 1 2 1 2 3 a = 15; a = b; a = *p; *p = 15; *p = b; *p = *p2; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  24. 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: • è il puntatore che punta una loc. i elementi (di tipo T ) dopo p; • come indirizzo di memoria, è l'indirizzo p + i x (dimensione diT) p + i M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  25. Algebra dei Puntatori • Esempi double *p, *q; ... q = p + 3; *(p + 3)=2.0; q++; q--; q+=2; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  26. Algebra dei Puntatori IDEONA !! equivalenza puntatori - vettori Brain Kernighan M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  27. Algebra dei Puntatori cartella[3] indirizzo dicartella[3]= (indirizzo base) + 3x(dimensione cella) • 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 21 33 13 4 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  28. Algebra dei Puntatori equivalente a double *p; ... p[ 5 ] *(p + 5) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

More Related