Hola que tal, con respecto a los punteros, el * es un puntero que apunta a una direccion de memoria y el & se usa para pasar las cosas por referencia, o mas bien para modificar el contenido de esa direccion de memoria.
Por ejemplo, no se si conoces las listas, bueno cuando vas creano una lista, declaras un puntero que va a apuntar a una direccion de memoria, y a otra y a otra segun cuantos elementos tengas en la lista, ahora bien, si tuvieras que hacer un recorrido, y modificar en el camino algun elemento de esa lista ya sea actualizarlo o eliminarlo, entonces tendras que usar el puntero de esta forma *&nombre permitiendo en este caso modificar la direccion de memoria y el contenido.
Basicamente, tene en cuenta esto:
El puntero * lo usas para apuntar a una direccion de memoria y lo usas de solo lectura.
El puntero & lo usas para modificar los contenidos en la memoria, elminar registros, etc.
Bueno espero que mas o menos te haya servido la explicacion y si alguien puede colaborar con esto les agradeceria, ya que es un tema muy importante y que tiene que ser bien asimilado para lograr buenos programas y hacer lo que uno quiera con esta herramienta que es tan potente.
Si me llegase a haber confundido por favor corrijanme. Por lo menos eso es lo que vimos en la facultad la semana pasada.
Un abrazo