Proba este ejemplo
Código C++:
Ver originalvoid cambiar(int & a) {a = 1;}
void cambiar2(int a) {a = 2;}
using namespace std;
int main()
{
int entero = 0;
cambiar(entero);
cout << entero<< endl;
cambiar2(entero);
cout << entero << endl;
}
Vas a notar que el primer llamado modifico la variable entero pero el segundo no. Pasar una variable por referencia o devolver la referencia es parecido a los punteros. Nada mas que como referencia vos usas la variable como si fue declarada. No tenes que usar el operador * para modifcar su valor.
A nivel memoria no estoy muy claro como se maneja.
El ejemplo que pusiste no se si es muy util, porque estarias devolviendo una referencia a un entero que no es statico, este pierde sentido al volver de la funcion.
Pero saliendo de ese problema. Con la primera implementacion, cualquier modificacion que hagas en c se hara sobre el mayor de los dos.
Saludos