Il passaggio x riferimento è indispensabile per poter modificare il contenuto di una variabile dichiarata in un'altra funzione (e non solo). Il passaggio per valore crea una nuova variabile copiandone il contenuto e la distrugge all'uscita della funzione.
Dal tuo src modificato ti allego un esempio:
#include<iostream>
using namespace std;
void calcolaA1(int x,int y,int & a)
{
a=x*y;
}
int calcolaA2(int x,int y)
{
return (x*y);
}
void calcolaA3(int x,int y,int a)
{
a= x*y;
}
int main()
{
int a,b,h;
cin>>b>>h;
a=0;
calcolaA1(b,h,a); // OK
cout<<a<<endl;
a=0;
a=calcolaA2(b,h); // OK
cout<<a<<endl;
a=0;
calcolaA3(b,h,a); // WRONG
cout<<a<<endl;
return 0;
}
CalcolaA3 crea un'altra variabile 'a' copiando il contenuto del chiamante (zero), esegue la moltiplicazione registrando il prodotto nella nuova 'a' ed in uscita libera la memoria -ovviamente errando-
Saluti,
Max