Un puntero es un objeto que apunta a una dirección de memoria( otro objeto o NULL ), te permite modificar el sector apuntado y crear y borrar variables dinámicamente por ejemplo. Y una referencia es una especie de apodo/alias, es la copia de otro objeto.
Para algunas cosas es lo mismo, como el ejemplo que estás dando, no pueden verse las diferencias. Pero digamos que los punteros tienen más funcionalidad en cuanto a la referencia. La referencia es solo una copia de otro objeto. Los punteros permiten más manipulación de datos.
Acá tenés buenas explicaciones:
http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/2010-February/007437.htmlhttp://listas.conclase.net/pipermail/cconclase_listas.conclase.net/2008-July/004047.html