我有一个基本的问题,char*
我不明白
char* aString = "Hello Stackoverflow";
指针指向字符链的第一个字符。
cout << *aString; // H
但为什么整个字符串保存在指针中?
cout << aString //Hello Stackoverflow
我希望有一个地址,地址不是保存在指针中吗?“Hello Stackoverflow”的地址在哪里?
非常感谢任何帮助
我有一个基本的问题,char*
我不明白
char* aString = "Hello Stackoverflow";
指针指向字符链的第一个字符。
cout << *aString; // H
但为什么整个字符串保存在指针中?
cout << aString //Hello Stackoverflow
我希望有一个地址,地址不是保存在指针中吗?“Hello Stackoverflow”的地址在哪里?
非常感谢任何帮助
有一个重载,operator<<(ostream&, char const*)
它输出从该指针开始的以空字符结尾的字符串,并且优先于ostream::operator<<(void*)
将输出地址的运算符。
如果您想要地址,请将指针转换为void*
.
字符串从该位置开始按顺序保存。由 C++ 继承的 C 规则简单地说,当您尝试使用 achar *
作为字符串时,它将继续读取字符,直到遇到 0字节。
如果您确实想获取地址,请告诉cout
不要将其解释为“字符串”:
std::cout << (void *)aString << std::endl;
标准规定 0 == '\0' 在哪里?
来自 C++11 草案,第 2.3-3 节:
基本执行字符集和基本执行宽字符集应分别包含基本源字符集的所有成员,加上表示警报、退格和回车的控制字符,加上一个空字符(分别为空宽字符),其表示全为零位。
aString
确实拥有一个地址,但是operator<<
您的代码选择 ( operator<<(ostream&, const char*)
) 的重载碰巧打印的不是给出的地址,而是从该地址开始的以空字符结尾的字符串。
如果要打印地址,可以通过强制转换来使用ostream::operator<<(void*)
重载。aString
void*