C++ 指向字符的问题
Posted
技术标签:
【中文标题】C++ 指向字符的问题【英文标题】:C++ pointer-to-char question 【发布时间】:2009-06-22 14:42:28 【问题描述】:char *ps;
ps = &anotherChar;
cout << ps;
为什么这显示 anotherChar 的值而不仅仅是地址?
【问题讨论】:
【参考方案1】:char *
存在 operator<<
重载,将其解释为要输出的字符串。如果你想要一个地址,你可以投到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++ 指向字符的问题的主要内容,如果未能解决你的问题,请参考以下文章