Указатели и Строки 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
заявление.