Я учу себя С++, и я немного запутался в указателях (в частности, в следующем исходном коде). Но сначала я продолжаю показывать вам то, что знаю (а затем противопоставляя код этому, потому что чувствую, что происходят какие-то противоречия).
Что я знаю:
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 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 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"?
Затем, почему это делается в инструкции print, используя CopyOfName
, а не *CopyOfName
? Указатели содержат адреса памяти? Использование *CopyOfName
распечатает содержимое ячейки памяти. Я пробовал это в Code:: Blocks, и если входной текст был "Hello World". Использование *CopyOfName
в заявлении распечатки просто даст "H". Это имеет смысл, поскольку, когда я объявил, что мне нужен блок памяти с "новой" вещью, это фактически возвращает указатель на первую часть динамически выделенного блока памяти.
Единственный способ, которым я могу смириться, это то, что строка на самом деле является указателем.
string testing = "Confused";
cout << testing << endl;
выведет слово "Confused"
Однако, если я попытаюсь скомпилировать
string testing = "Confused";
cout << *testing;
Появляется сообщение об ошибке.
В принципе, чтобы обобщить мой вопрос, я пытаюсь понять код с помощью strcpy
и оператора cout
.