lezione 12 (28 marzo 2012) funzioni memoria - puntatori
TRANSCRIPT
![Page 1: Lezione 12 (28 marzo 2012) funzioni memoria - puntatori](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/1.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/2.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/3.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/4.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/5.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/6.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/7.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/8.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/9.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/10.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/11.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/12.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/13.jpg)
Valori di ritorno
f...pIn1
pInN...
pOut1
pOutM
?
![Page 14: Lezione 12 (28 marzo 2012) funzioni memoria - puntatori](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/14.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/15.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/16.jpg)
Puntatori
...
int x;
int *px;
...Variabile puntatore a intero
(asterisco)
Variabile intera
![Page 17: Lezione 12 (28 marzo 2012) funzioni memoria - puntatori](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/17.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/18.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/19.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/20.jpg)
Proprietà fondamentale
*&x = x
![Page 21: Lezione 12 (28 marzo 2012) funzioni memoria - puntatori](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/21.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/22.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/23.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/24.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/25.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/26.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/27.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/28.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/29.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/30.jpg)
Scambio del valore di due variabili
a
5
b
10
![Page 31: Lezione 12 (28 marzo 2012) funzioni memoria - puntatori](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/31.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/32.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/33.jpg)
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](https://reader033.vdocumenti.com/reader033/viewer/2022060115/557bedafd8b42aab048b4dda/html5/thumbnails/34.jpg)
Scambio del valore di due variabili
void scambia(int *a, int* b){int aux;
aux = *a;*a = *b;*b = aux;
}