la risposta è più facile di quello che sembra (... anche se in realtà in logica proposizionale è mooooolto più difficile di quello che si può sospettare )
Vabbè la spiegazione-niubbo è questa:
quando passi una variabile ad una funzione (per valore)questa viene "sdoppiata", e può mantenere lo stesso nome, oppure no.
Quando nella definizione della funzione c'è scritto
(tipo nomevariabile,...) avrai una variabile nomevariabile del tutto INDIPENDENTE dal valore della variabile "padre".
Alla chiamata della funzione nomevariabile viene impostata al valore che passi alla funzione, poi "si sgancia".
Dimezzi la variabile "figlia" (dentro la funzione) fuori dalla funzione la variabile "padre" rimarrà identica.
----------
Il passaggio per "riferimento" è un modo per "incapsulare" i puntatori C; lo riconosci perchè c'è
(tipo & nomevariabile,...)
In questo caso nomevariabile è un [i]alias[/b] della variabile "padre".
Se dimezzi la variabile "figlia", anche la variabile "padre" sarà dimezzata
EDIT:
codice:
// a viene sempre lasciato invariato FUORI da questa funzione
// perchè è passata per valore (int a, manca l' &)
// quindi puoi paciugare il primo parametro quanto vuoi, ma FUORI
// non avrai effetti collaterali
// mentre il secondo parametro (b) viene passato per riferimento,
// (c'è la &), QUINDI le modifiche che farai al SECONDO PARAMETRO
// varranno anche fuori dalla funzione test
void test(int a, int& b)
{
a /= 2;
for (int k = 0; k < a; k++)
{
b *= 2;
}
}
void main()
{
int x = 4, y = 1;
test(x, y);
cout << x << " " << y << endl;
// nella prima chiamata il PRIMO PARAMETRO
// non viene modificato (è passato per valore)
// quindi x (primo parametro) prima e dopo la chiamata sarà identico
// ossia x=4 test() x=4
// il SECONDO parametro invece cambia anche FUORI
// y=1 test() y=4
test(y, x);
cout << x << " " << y << endl;
// bene, stesso discorso.
// solo che questa volta il PRIMO parametro (quello "fisso") è y
// y=4 test() y=4
// mentre il SECONDO parametro cambia
// x=4 test() x= 16
}
Riassumendo: il PRIMO PARAMETRO rimane invariato (fuori), il SECONDO viene paciugato.
Indipendentemente da come si chiamano fuori:
test(pippo,pluto) => pippo rimane uguale,e pluto cambia
test(x,y) => x rimane uguale, y cambia
test(y,x) => y rimane uguale, x cambia
test(x,x) COSA FA? (te lo lascio per esercizio!)