2015-02-24 50 views
0
#include <iostream> 

#include <string.h> 

using namespace std; 

int main() 

{ 

    char x[100]="hello"; 

    int s=strlen(x); 

    cout<<&(x[0]); 

} 

如果我编译并运行它,为什么字符串的行为不同?

输出为你好

为什么不是输出的性格特征“H”的地址?

+1

尝试'cout <<(void *)&(x [0]);' – vsoftco 2015-02-24 14:21:13

+2

已经回答很多次了 – texasbruce 2015-02-24 14:27:33

+1

“为什么输出结果不是地址'h'?” - 是的,你只需要适当地解释它。 – 2015-02-24 14:32:38

回答

10

因为operator <<过载,因此const char*打印由const char*指向的零终止的C字符串。

+0

如果你实际上试图打印地址,并且char *实际上并不指向零终止的字符数组,则会导致令人感到兴奋的结果。 – Cubic 2015-02-24 14:24:42

+1

@Cubic如果你想要的地址,一个简单的cast''void *'很好用。 – 2015-02-24 14:25:46

1

指针不保存指向单个对象或数组的第一个对象的信息。还要考虑到表达式中的数组名转换为指向其第一个元素的指针。所以,如果你有例如const char *类型的指针这样

const char *p = "Hello"; 

然后很自然的期望,这种说法

std::cout << p << std::endl; 

将输出字符串文字“你好”。

如果要输出字符串文字的第一个元素的地址,你必须使用另一个重载operator <<类型void *

std::cout << (const void *)p << std::endl; 

的指针,因此,有一个两难如何处理char *类型的指针并且有利于将这些指针视为指向字符串的第一个元素的指针,并因此输出整个字符串。

+0

我可以问你为什么继续回滚完全有效的编辑,改进你自己的答案的格式? – Shoe 2015-02-24 14:31:03

+0

@Jefffrey是的,你可能会问。:)我没有回滚编辑。看起来我们正在同时编辑,当我保存编辑时,您的编辑已被丢弃。 – 2015-02-24 14:33:55

相关问题