char *ps;
ps = &anotherChar;
cout << ps;
为什么这会显示anotherChar的值而不仅仅是地址?
答案 0 :(得分:13)
operator<<
有一个char *
重载,它将其解释为要输出的字符串。如果你想要一个地址,你可以转换为void*
。
答案 1 :(得分:5)
原因是C / C ++中的char*
是双重目的类型。它既可以是指向单个字符的指针,也可以是C样式字符串。 cout函数选择将其视为C样式字符串,因此将打印值而不是地址。
这也是您的应用程序的潜在问题。 C样式字符串以null终止符值结尾。因此,它有可能读取非法内存,因为它没有正确初始化。
答案 2 :(得分:3)
运营商&lt;&lt;假设您要打印字符串而不是字符串的地址 由于ps指向字符串,如果要打印ps的地址,请使用“&lt;&lt;&amp; ps”
答案 3 :(得分:2)
因为char *是c风格的字符串。它完成它认为你想要的东西,它打印出ps指向的c字符串。
您可以使用以下方式打印地址:
cout << static_cast<void*>(ps) << endl;
答案 4 :(得分:1)
&lt;&lt;运算符有许多重载用于处理流。
其中一个为您打印一个零终止字符串。用于指向零终止字符串的变量的类型是char *。这就是你所使用的。如果你写了:
char* ps = "hello";
cout << ps;
这个重载会打印“你好”。幸运的是,在另一个策略之后存储器中存在零,以便&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;打印anotherChar后停止打印字符。如果这不是零,你很可能会从内存中打印出随机字符,直到遇到零。
答案 5 :(得分:1)
如果你想要指针值:
cout << (void *) ps;
答案 6 :(得分:0)
C ++没有内置类型的字符串。它使用null终止(以'\ 0'结尾的数组)char *
(加或减const限定符)或char []
作为表示字符串的约定。所有标准C库都使用此约定。
因此,STL ostreams
也使用此约定。