C++ 指向字符的问题

Posted

技术标签:

【中文标题】C++ 指向字符的问题【英文标题】:C++ pointer-to-char question 【发布时间】:2009-06-22 14:42:28 【问题描述】:
char *ps;
ps = &anotherChar;
cout << ps;

为什么这显示 anotherChar 的值而不仅仅是地址?

【问题讨论】:

【参考方案1】:

char * 存在 operator&lt;&lt; 重载,将其解释为要输出的字符串。如果你想要一个地址,你可以投到void*

【讨论】:

如果我没记错的话,强制转换为 void* 将默认以十六进制打印地址。 为什么这个类型有一个运算符重载? 一般来说,当你有一个 char* 时,它是一个C 风格的字符串,大多数函数都会这样对待它。在这种情况下,它允许流类将C 字符串输出为文本。【参考方案2】:

原因是 C/C++ 中的 char* 是一种双重用途的类型。它既可以是指向单个字符的指针,也可以是 C 风格的字符串。 cout 函数选择将其视为 C 样式字符串,因此将打印值而不是地址。

这也是您的应用程序的一个潜在问题。 C 样式字符串以空终止符值结尾。因此这有可能读取非法内存,因为它没有正确初始化。

【讨论】:

这怎么可能是 C 风格的字符串?!。 C风格的字符串是char数组。【参考方案3】:

运算符 由于 ps 指向字符串,如果要打印 ps 的地址,请使用 "

【讨论】:

因为 9/10 当你想要打印一个字符串时,你想要的是字符串的内容——而不是内存中的地址。 谢谢。我真的很感激。【参考方案4】:

因为 char* 是 c 风格的字符串。它会做它认为你想要的,即打印出指向 ps 的 c 字符串。

您可以打印地址:

cout << static_cast<void*>(ps) << endl;

【讨论】:

【参考方案5】:

其中一个会为您打印一个以零结尾的字符串。用于指向以零结尾的字符串的变量类型是 char*。这是你用过的。如果你写:

char* ps = "hello";
cout << ps;

这个重载会打印“hello”。在 anotherChar 之后内存中有一个零可能只是运气,因此

【讨论】:

【参考方案6】:

如果你想要指针值:

cout << (void *) ps;

【讨论】:

【参考方案7】:

C++ 没有内置的字符串类型。它使用空终止(以 '\0' 结尾的数组)char *(加或减 const 限定符)或 char [] 作为表示字符串的约定。所有标准 C 库都使用此约定。

所以,STL ostreams 也使用这个约定。

【讨论】:

以上是关于C++ 指向字符的问题的主要内容,如果未能解决你的问题,请参考以下文章

指针指向 C++ 中函数传递的字符串

c++ 使用指针进行字符串操作,中间为空

如何使函数返回指向函数的指针? (C++)

如何编写函数,用C++语言实现将一个字符串插入到另一个字符串的指定位置,最好用指针指向字符串来实现?

向量中不存在 C++ 字符串成员变量

拆分字符串的最佳方法是啥? (c++) [重复]