我在教自己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
?这是否意味着所有字符串都是必不可少的指针?就像字符串测试="Hello world"; 实际上是指向存储"H"的存储位置的指针吗?
接下来,为什么它在print out语句中使用CopyOfName
而不是*CopyOfName
?指针有内存地址吗?使用*CopyOfName
会打印出内存位置的内容.我在Code :: Blocks中尝试了这个,如果输入文本是"Hello World".*CopyOfName
在打印输出语句中使用只会给出"H".这是有道理的,因为当我声明我需要一个带有'new'的内存块时,这实际上会返回一个指向动态分配的内存块的第一部分的指针.
我可以调和它的唯一方法是字符串实际上是一个指针.
string testing = "Confused"; cout << testing << endl;
会打印出"困惑"这个词
但是,如果我尝试编译
string testing = "Confused"; cout << *testing;
我收到一条错误消息.
基本上,总结一下我的问题,我试图理解代码strcpy
和cout
声明.
看起来你理解C风格的字符串是什么,但总而言之,它们只是内存中的字符数组,按照惯例以nul字符终止\0
.通常它们通过char*
指向字符串中的第一个字母来引用.当它们被打印时,通常从第一个字符开始打印字符串的字符,并且当到达\0
终止符时打印(或复制等)停止.
An std::string
是一个(通常)包装C风格字符串的类.这意味着std::string
对象(通常)具有用于实现其功能的私有C样式字符串.该函数std::string::c_str()
返回指向此底层C样式字符串的指针.
我们假设它char *str;
指向C风格的字符串.如果您尝试运行cout << *str << endl;
,您会注意到只打印了第一个字符.那是因为C++的函数重载.数据类型*str
是char
,所以调用char
版本cout
并忠实地打印单个字符*str
.对于C风格的字符串兼容的版本cout
,需要一个char*
作为参数对待指针作为C风格的字符串印刷目的.例如,如果您cout
是int*
,int
则不会打印基础.
编辑:另一个评论:
您尝试取消引用std::string
对象失败的原因是,它确实不是指针.您可以取消引用的返回值std::string::c_str()
,然后您将返回第一个char
字符串.
相关:如何实现std :: string?.