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

Upload: stelitano

Post on 13-Jun-2015

216 views

Category:

Documents


1 download

TRANSCRIPT

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;

}