c ++中奇怪的char数组输出

时间:2013-09-02 00:41:31

标签: c++

我遇到了一个奇怪的问题。 在C ++中

char s[]="123abc89";
cout<<s[0]<<endl;  //1  it is right
cout<<&s[0]<<endl; // I can't understand why it is "123abc89"

提前多多感谢。

2 个答案:

答案 0 :(得分:6)

s[0]是字符数组的第一个元素。 &s[0]是第一个元素的地址,与数组的地址相同。给定字符数组的起始地址,std::cout使用以下overload of operator<<打印出从该地址开始的整个字符串:

// prints the c-style string whose starting address is "s"
ostream& operator<< (ostream& os, const char* s);

如果要打印字符数组的起始地址,可以采用以下方法:

// std::hex is optional. It prints the address in hexadecimal format.  
cout<< std::hex << static_cast<void*>(&s[0]) << std::endl;

这将使用另一个overload of operator<<

// prints the value of a pointer itself
ostream& operator<< (const void* val);

答案 1 :(得分:0)

您正在遇到C(和C ++)如何处理字符串(而不是C ++的std :: string)的内部结构。

字符串由指向其第一个字符的指针引用。这是代码,显示了这一点:

char *ptr;

ptr = "hello\n";

printf("%s\n", ptr);
ptr++;
printf("%s\n", ptr);