Punteros y cuerdas C ++

Me estoy enseñando C ++ y estoy un poco confundido acerca de los punteros (específicamente en el siguiente código fuente). Pero primero, continúo mostrándoles lo que sé (y luego comparo el código con esto porque siento que hay algunas contradicciones).

Lo que yo sé:

int Age = 30;
int* pointer = &Age;

cout << "The location of variable Age is: " << pointer << endl;
cout << "The value stored in this location is: " << *pointer << endl;

Los punteros tienen direcciones de memoria. Usando el operador de indirección (desreferencia) (el *), puede acceder a lo que está almacenado en la ubicación de memoria del puntero. En el código de este libro me cuesta entender ...

cout << "Enter your name: ";
string name;
getline(cin, name); //gets full line up to NULL terminating character

int CharsToAllocate = name.length() + 1; //calculates length of string input
                          //adds one onto it to adjust for NULL character
char* CopyOfName = new char[CharsToAllocate];
// pointer to char's called CopyOfName, is given the memory address of the 
//beginning of a block
//of memory enough to fit CharsToAllocate. Why we added 1? Because char's need a 
//NULL terminating character (\0)

strcpy(CopyOfName, name.c_str()); //copies the string name, into a pointer?

cout << "Dynamically allocated buffer contains: " << CopyOfName << endl;
delete[] CopyOfName; //always delete a pointer assigned by new to prevent memory leaks

Salida:

Enter your name: Adam
Dynamically allocated buffer contains: Adam

Los comentarios en el código anterior son mis comentarios. Mi problema comienza constrcpy. Por que esname.c_str() copiado en un punteroCopyOfName? ¿Significa esto que todas las cadenas son punteros esenciales? Así que como la prueba de cuerdas = "Hola mundo"; ¿Es en realidad un puntero que apunta a la ubicación de la memoria donde se almacena "H"?

A continuación, ¿por qué está en la declaración de impresión utilizandoCopyOfName y no*CopyOfName? ¿Los punteros tienen direcciones de memoria? Utilizando*CopyOfName Imprimiría el contenido de la ubicación de la memoria. Intenté esto en Código :: Bloques y si el texto de entrada era "Hola mundo". Utilizando*CopyOfName en la declaración impresa sólo daría una "H". Esto tiene sentido, ya que cuando declaré que necesitaba un bloque de memoria con la cosa 'nueva', esto devuelve un puntero a la primera parte del bloque de memoria asignado dinámicamente.

La única forma en que puedo conciliar esto es si una cadena es en realidad un puntero.

string testing = "Confused";
cout << testing << endl;

Imprimiría la palabra "Confundido"

Sin embargo, si intento compilar

string testing = "Confused";
cout << *testing; 

Recibo un mensaje de error.

Básicamente, para resumir mi pregunta, estoy tratando de entender el código constrcpy y elcout declaración.

Respuestas a la pregunta(9)

Su respuesta a la pregunta