Указатели и Строки C ++

Я учу себя C ++, и я немного запутался в отношении указателей (особенно в следующем исходном коде). Но сначала я покажу вам то, что знаю (а затем сопоставлю код с этим, потому что я чувствую, что существуют противоречия).

Что я знаю:

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;

Указатели содержат адреса памяти. Используя оператор косвенного обращения (разыменования) (*), вы можете получить доступ к тому, что хранится в ячейке памяти указателя. На код в этой книге у меня проблемы с пониманием ...

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

Выход:

Enter your name: Adam
Dynamically allocated buffer contains: Adam

Комментарии в приведенном выше коде являются моими комментариями. Моя проблема начинается сstrcpy, Почемуname.c_str() скопированы в указательCopyOfName? Значит ли это, что все строки являются существенными указателями? Так что вроде string testing = "Hello world"; Действительно ли указатель указывает на область памяти, где хранится «H»?

Далее, почему это в распечатке заявления с помощьюCopyOfName и нет*CopyOfName? Указатели держат адреса памяти? С помощью*CopyOfName распечатал бы содержимое ячейки памяти. Я попробовал это в Code :: Blocks и, если входной текст был «Hello World». С помощью*CopyOfName в заявлении распечатки просто дал бы "H". Это имеет смысл, поскольку, когда я объявил, что мне нужен блок памяти с «новой» вещью, это фактически возвращает указатель на первую часть динамически выделенного блока памяти.

Единственный способ примирить это, если строка на самом деле является указателем.

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

распечатал бы слово "Confused"

Однако, если я попытаюсь скомпилировать

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

Я получаю сообщение об ошибке.

По сути, чтобы подвести итог моего вопроса, я пытаюсь понять код сstrcpy иcout заявление.

Ответы на вопрос(9)

Ваш ответ на вопрос