allora supponiamo di avere questo main
i parametri che si passano alla funzione ("a" e "b") vengono detti parametri attualicodice:int main() { int a = 10, b = 20; moltiplica(a, b); return 0; }
invece i parametri che compaiono nella definizione della funzione
sono detti parametri formalicodice:int moltiplica(int a, int b) { return a*b; }
nel passaggio per valore, i parametri formali sono memorizzati in locazioni di memoria diverse da quelle dei paramtri attuali
cioè nel momento in cui entro nel corpo della funzione, vengono "allocati" i parametri formali, (di fatto sono nuove variabili)
questa funzione
è identica a quella precedente perchè anche in questo caso vengono allocate 2 variabili nuove (come prima)codice:int moltiplica(int x, int y) { return x*y; }
il cui contenuto è la copia dei paramtri attuali
di solito per capire questo concetto si parla dei record di attivazione (stack)
la funzione moltiplica la modifico per farti capire come funziona il passaggio per valore
ora se al posto di quella moltiplica metticodice:la freccia <-- indica il punto in cui si trova l'esecuzione del processo (programma) int main() { int a = 10, b = 20, c; c = moltiplica(a, b);<-- return 0; } lo stack è questo ---------- | main | ---------- | a | 10 | | b | 20 | | c | ?? | ---------- successivamente viene richiamata la funzione int moltiplica(int x, int y) {<-- x = x * 10; return x*y; } e questo è lo stack, in cui le variabili locali sono x e y le variabili a e b non sono accessibili alla funzione moltiplica (perchè non sono variabili globali) -------------- | moltiplica | |------------| | x | 10 | | y | 20 | -------------- | main | -------------- | a | 10 | | b | 20 | | c | ?? | -------------- int moltiplica(int x, int y) { x = x * 10; return x*y; <-- } lo stack (N.B. "a" non è stata modificata) -------------- | moltiplica | |------------| | x | 100 | | y | 20 | -------------- | main | -------------- | a | 10 | | b | 20 | | c | ?? | -------------- int main() { int a = 10, b = 20, c; c = moltiplica(a, b); return 0; <-- } lo stack è ora questo -------------- | main | -------------- | a | 10 | | b | 20 | | c | 2000 | --------------
ecco perchè le funzioni sono "identiche"codice:int moltiplica(int a, int b) {<-- a = a * 10; return a*b; } lo stack è -------------- | moltiplica | |------------| | a | 10 | | b | 20 | -------------- | main | -------------- | a | 10 | | b | 20 | | c | ?? | -------------- int moltiplica(int a, int b) { a = a * 10; return a*b; <-- } lo stack (N.B. "a" del main non è stata modificata) -------------- | moltiplica | |------------| | a | 100 | | b | 20 | -------------- | main | -------------- | a | 10 | | b | 20 | | c | ?? | -------------- int main() { int a = 10, b = 20, c; c = moltiplica(a, b); return 0; <-- } lo stack è ora questo -------------- | main | -------------- | a | 10 | | b | 20 | | c | 2000 | --------------

Rispondi quotando