C ++指向char的问题

时间:2009-06-22 14:42:29

标签: c++ pointers

char *ps;
ps = &anotherChar;
cout << ps;

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

7 个答案:

答案 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也使用此约定。