Lezione 12 (28 marzo 2012) funzioni memoria - puntatori

34
Passaggio per valore Al momento del richiamo della funzione il valore dei parametri attuali sono ricopiati nello spazio di memoria allocato ai parametri formali

Transcript of Lezione 12 (28 marzo 2012) funzioni memoria - puntatori

Page 1: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

● Al momento del richiamo della funzione il valore dei parametri attuali sono ricopiati nello spazio di memoria allocato ai parametri formali

Page 2: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

Page 3: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

mainx y5 ?

Page 4: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

main fx y rv a5 ? ?

5

Page 5: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

main fx y rv a b5 ? ?

5?

Page 6: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

main fx y rv a b5 ? ?

5?

6

Page 7: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

main fx y rv a b5 ? ?

5?

6

Passaggio per valore: le modifiche effettuate nella funzione restano confinate

nell'ambiente locale

Page 8: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

main fx y rv a b5 ? ?

5?

636

Page 9: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

main fx y rv a b5 ? ?

5?

636

36

Page 10: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

mainx y5 ?

36

Al termine della funzione l'ambiente locale viene

eliminato

Page 11: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per valore

main(){int x, y;

x=5;y=f(x);printf(“%d %d”,x,y);

}

int f(int a){int b;a=a+1;b=a*a;return b;

}

mainx y5 ?

36

5 36

standard output

Page 12: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Valori di ritorno

f... rType f(type1 p1, type2 p2 ... typeN pN) p1

pN

f...p1

pN

void f(type1 p1, type2 p2 ... typeN pN)

f

rType f(void) rType f()

f

void f(void) f()

main

Page 13: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Valori di ritorno

f...pIn1

pInN...

pOut1

pOutM

?

Page 14: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Valori di ritorno e passaggio per indirizzo

● nell'istruzione return può essere specificato una espressione di tipo atomico (int, float, char ecc)

● se la funzione deve restituire più di un risultato non si può utilizzare il return

● la tecnica utilizzata è quella del passaggio dei parametri per riferimento (indirizzo)

● più in generale il passaggio per riferimento consente alla funzione di modificare i parametri attuali

Page 15: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Puntatori

● Se la funzione conoscesse la posizione (indirizzo) in memoria dei parametri attuali potrebbe accedervi per modificarli

● La tecnica è implementata in C mediante l'utilizzo del puntatore

● Un puntatore è un indirizzo di memoria● Una variabile di tipo puntatore può contenere

l'indirizzo di memoria di un'altra variabile

Page 16: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Puntatori

...

int x;

int *px;

...Variabile puntatore a intero

(asterisco)

Variabile intera

Page 17: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Puntatori

...int x;int *px;...

px = &x;*px = 5;...

Indirizzo Contenuto variabile... ...0x00000100 ? x0x00000104 ?0x000001080x0000010C0x00000110

...

px

Supponiamo che sia un intero che un puntatore occupino 4 byte

Page 18: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Puntatori

...int x;int *px;...

px = &x;*px = 5;...

Indirizzo Contenuto variabile... ...0x00000100 ? x0x00000104 0x000001000x000001080x0000010C0x00000110

...

px

& : operatore di estrazione di indirizzo

Page 19: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Puntatori

...int x;int *px;...

px = &x;*px = 5;...

Indirizzo Contenuto variabile... ...0x00000100 0x00000005 x0x00000104 0x000001000x000001080x0000010C0x00000110

...

px

* : operatore di dereferenziazione di un indirizzo (estrazione del contenuto)

Page 20: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Proprietà fondamentale

*&x = x

Page 21: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

● Se alla funzione A forniamo l'indirizzo di una variabile della funzione chiamante B, la funzione A può modificare il valore della variabile di B

void A(int *x){*x = *x + 1;

}

Page 22: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

main(){int x;

x=5;f(&x);printf(“%d”,x);

}

void f(int *a){

*a = *a + 1;

}

Page 23: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

x5

mainmain(){int x;

x=5;f(&x);printf(“%d”,x);

}

void f(int *a){

*a = *a + 1;

}

Page 24: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

main(){int x;

x=5;f(&x);printf(“%d”,x);

}

void f(int *a){

*a = *a + 1;

}

fx *a5

main

Page 25: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

main(){int x;

x=5;f(&x);printf(“%d”,x);

}

void f(int *a){

*a = *a + 1;

}

fx *a56

main

Page 26: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

main(){int x;

x=5;f(&x);printf(“%d”,x);

}

void f(int *a){

*a = *a + 1;

}

x56

main

Page 27: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Passaggio per indirizzo

main(){int x;

x=5;f(&x);printf(“%d”,x);

}

void f(int *a){

*a = *a + 1;

}

mainx56

6

standard output

Page 28: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

scanf

main(){int x;

scanf(“%d”,&x);....

xmain scanf

*...

Nella scanf si usa il simbolo & perchè le variabili da leggere sono passate per indirizzo

Page 29: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

scanf

main(){int x;

lettura(&x, ...);...

}

void lettura(int *z, ...){

...scanf(“%d”,z);...

}

letturax *z

main scanf*...

Nella scanf non è necessario l'operatore &

in quanto z è già un indirizzo

Page 30: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Scambio del valore di due variabili

a

5

b

10

Page 31: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Scambio del valore di due variabili

a

5

b

10

aux

5

1

...aux = a;a = b;b = aux;...

Page 32: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Scambio del valore di due variabili

a

10

b

10

aux

5

1

2

...aux = a;a = b;b = aux;...

Page 33: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Scambio del valore di due variabili

a

10

b

5

aux

5

1 3

2

...aux = a;a = b;b = aux;...

Page 34: Lezione 12 (28 marzo 2012) funzioni   memoria - puntatori

Scambio del valore di due variabili

void scambia(int *a, int* b){int aux;

aux = *a;*a = *b;*b = aux;

}