Como vimos las funciones por lo general reciben parámetros, éstos hasta el momento fueron pasados a la función mediante el "paso por valor" que consiste en hacer un copia del argumento, para que la función trabaje con la copia y no con el argumento original.
Esto significa que si la función modificara el valor, el original no se alteraría ya que estamos manejando una copia. Esto resulta bastante útil para asegurarnos de que la función no modifique nuestros argumentos de manera accidental.
Pero surgen dos problemas:
1.- Podríamos querer modificar el argumento original y no una copia.
2.- Con mucha cantidad de variables (o estructuras como veremos) el paso por valor (copiando) puede resultar un gasto excesivo de memoria.
Para resolver estos problemas contamos con las referencias y punteros, por el momento nos ocuparemos de las referencias.
Una referencia a una variable es un "alias" de la variable. Para indicarle a C++ que estamos hablando de una referencia y no una variable anteponemos al nombre el caracter ampersand (&).
Por ejemplo una referencia llamada refPresupuesto apuntando a un valor double se escribiría así:
double &refPresupuesto
Si quisieramos que una función trabaje con la variable original y no con una copia podríamos indicarle a la función que reciba el parametro como una referencia, veamos un ejemplo:
Cuando una función se declara anteponiendo la palabra reservada void le estamos diciendo a C++ que esa función no devolverá valor alguno.
Como se comenta en el código, en la llamada de la función es importante notar que no hay manera de darse cuenta si el parámetro es pasado por referencia (modificable) o si es por valor (se le envía una copia a la función).
NOTA: Este texto no es mio, es copiado de:
http://codigomaldito.blogspot.com/2005/11/paso-por-referencia.html