我正在自学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”,则在print out语句中使用* CopyOfName只会给出“H”。这是有道理的,因为当我声明需要带有“new”东西的内存块时,这实际上返回了一个指向动态分配的内存块第一部分的指针。
唯一可以使我解决此问题的方法是假设字符串实际上是指针。
string testing = "Confused";
cout << testing << endl;
将会打印出单词"Confused"
然而,如果我尝试编译
string testing = "Confused";
cout << *testing;
我收到了一个错误消息。
简单来说,总结我的问题,我正在尝试理解使用strcpy
和cout
语句的代码。
NULL
终止字符”。但是有一个“NUL
”('\0'
)字符,这可能是你想要表达的。 - yzt