Lezione 12 (28 marzo 2012) funzioni memoria - puntatori

308 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
308
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lezione 12 (28 marzo 2012) funzioni memoria - puntatori

  1. 1. Passaggio per valore● Al momento del richiamo della funzione il valore dei parametri attuali sono ricopiati nello spazio di memoria allocato ai parametri formali
  2. 2. Passaggio per valoremain(){ 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;}
  3. 3. Passaggio per valoremain(){ main int x, y; x y 5 ? x=5; y=f(x); printf(“%d %d”,x,y);}int f(int a){ int b; a=a+1; b=a*a; return b;}
  4. 4. Passaggio per valoremain(){ main f int x, y; x y rv a 5 ? ? x=5; 5 y=f(x); printf(“%d %d”,x,y);}int f(int a){ int b; a=a+1; b=a*a; return b;}
  5. 5. Passaggio per valoremain(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y);}int f(int a){ int b; a=a+1; b=a*a; return b;}
  6. 6. Passaggio per valoremain(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6}int f(int a){ int b; a=a+1; b=a*a; return b;}
  7. 7. Passaggio per valoremain(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6}int f(int a){ int b; a=a+1; b=a*a; return b; Passaggio per valore:} le modifiche effettuate nella funzione restano confinate nellambiente locale
  8. 8. Passaggio per valoremain(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6} 36int f(int a){ int b; a=a+1; b=a*a; return b;}
  9. 9. Passaggio per valoremain(){ main f int x, y; x y rv a b 5 ? ? x=5; 5 y=f(x); ? printf(“%d %d”,x,y); 6} 36int f(int a){ 36 int b; a=a+1; b=a*a; return b;}
  10. 10. Passaggio per valoremain(){ main int x, y; x y 5 ? x=5; y=f(x); printf(“%d %d”,x,y);}int f(int a){ int b; 36 a=a+1; b=a*a; return b; Al termine della funzione} lambiente locale viene eliminato
  11. 11. Passaggio per valoremain(){ main int x, y; x y 5 ? x=5; y=f(x); printf(“%d %d”,x,y);}int f(int a){ int b; 36 a=a+1; b=a*a; standard output return b; 5 36}
  12. 12. Valori di ritornop1 ... f rType f(type1 p1, type2 p2 ... typeN pN)pNp1 void f(type1 p1, type2 p2 ... typeN pN) ... fpN rType f(void) f rType f() void f(void) f main f()
  13. 13. Valori di ritornopIn1 pOut1 ... f ...pInN pOutM ?
  14. 14. Valori di ritorno e passaggio per indirizzo● nellistruzione 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
  15. 15. Puntatori● Se la funzione conoscesse la posizione (indirizzo) in memoria dei parametri attuali potrebbe accedervi per modificarli● La tecnica è implementata in C mediante lutilizzo del puntatore● Un puntatore è un indirizzo di memoria● Una variabile di tipo puntatore può contenere lindirizzo di memoria di unaltra variabile
  16. 16. Puntatori... Variabile interaint x;int *px; Variabile puntatore a intero... (asterisco)
  17. 17. Puntatori...int x; Indirizzo Contenuto variabileint *px; ... ...... 0x00000100 ? x 0x00000104 ? pxpx = &x; 0x00000108*px = 5; 0x0000010C... 0x00000110 ... Supponiamo che sia un intero che un puntatore occupino 4 byte
  18. 18. Puntatori...int x; Indirizzo Contenuto variabileint *px; ... ...... 0x00000100 ? x 0x00000104 0x00000100 pxpx = &x; 0x00000108*px = 5; 0x0000010C... 0x00000110 ... & : operatore di estrazione di indirizzo
  19. 19. Puntatori...int x; Indirizzo Contenuto variabileint *px; ... ...... 0x00000100 0x00000005 x 0x00000104 0x00000100 pxpx = &x; 0x00000108*px = 5; 0x0000010C... 0x00000110 ... * : operatore di dereferenziazione di un indirizzo (estrazione del contenuto)
  20. 20. Proprietà fondamentale *&x = x
  21. 21. Passaggio per indirizzo● Se alla funzione A forniamo lindirizzo 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; }
  22. 22. Passaggio per indirizzomain(){ int x; x=5; f(&x); printf(“%d”,x);}void f(int *a){ *a = *a + 1;}
  23. 23. Passaggio per indirizzomain(){ main int x; x 5 x=5; f(&x); printf(“%d”,x);}void f(int *a){ *a = *a + 1;}
  24. 24. Passaggio per indirizzomain(){ main f int x; x *a 5 x=5; f(&x); printf(“%d”,x);}void f(int *a){ *a = *a + 1;}
  25. 25. Passaggio per indirizzomain(){ main f int x; x *a 5 x=5; 6 f(&x); printf(“%d”,x);}void f(int *a){ *a = *a + 1;}
  26. 26. Passaggio per indirizzomain(){ main int x; x 5 x=5; 6 f(&x); printf(“%d”,x);}void f(int *a){ *a = *a + 1;}
  27. 27. Passaggio per indirizzomain(){ main int x; x 5 x=5; 6 f(&x); printf(“%d”,x);}void f(int *a){ *a = *a + 1; standard output} 6
  28. 28. scanfmain(){ main scanf int x; x *... scanf(“%d”,&x); .... Nella scanf si usa il simbolo & perchè le variabili da leggere sono passate per indirizzo
  29. 29. scanfmain(){ main lettura scanf int x; x *z *... lettura(&x, ...); ...}void lettura(int *z, ...){ ... Nella scanf non è scanf(“%d”,z); necessario loperatore & ... in quanto z è già un} indirizzo
  30. 30. Scambio del valore di due variabili a b 5 10
  31. 31. Scambio del valore di due variabili a b 5 10 1 aux 5 ... aux = a; a = b; b = aux; ...
  32. 32. Scambio del valore di due variabili a b 2 10 10 1 aux 5 ... aux = a; a = b; b = aux; ...
  33. 33. Scambio del valore di due variabili a b 2 10 5 1 3 aux 5 ... aux = a; a = b; b = aux; ...
  34. 34. Scambio del valore di due variabili void scambia(int *a, int* b){ int aux; aux = *a; *a = *b; *b = aux; }

×