Uso del operador & en firmas de funciones C ++

Actualmente estoy leyendo a través de C ++ acelerado y me di cuenta de que realmente no entiendo cómo y funciona en las firmas de funciones.

int* ptr=#

significa que ptr ahora tiene la dirección en num, pero ¿qué significa eso?

void DoSomething(string& str)

de lo que entiendo es un pase por referencia de una variable (lo que significa pasar la dirección) pero cuando lo hago

void DoSomething(string& str)
{
  string copy=str;
}

lo que crea es una copia de str. Lo que pensé que haría sería generar un error ya que estoy tratando de asignar un puntero a una variable.

¿Que está sucediendo aquí? ¿Y cuál es el significado de usar * y & en llamadas a funciones?

Respuestas a la pregunta(9)

Su respuesta a la pregunta