我遇到了一个奇怪的问题。在 C++ 中
char s[]="123abc89";
cout<<s[0]<<endl; //1 it is right
cout<<&s[0]<<endl; // I can't understand why it is "123abc89"
提前非常感谢。
我遇到了一个奇怪的问题。在 C++ 中
char s[]="123abc89";
cout<<s[0]<<endl; //1 it is right
cout<<&s[0]<<endl; // I can't understand why it is "123abc89"
提前非常感谢。
s[0]
是字符数组的第一个元素。&s[0]
是第一个元素的地址,与数组的地址相同。给定一个字符数组的起始地址,std::cout
打印出从该地址开始的整个字符串,使用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;
这将改为使用 operator<< 的另一个重载:
// prints the value of a pointer itself
ostream& operator<< (const void* val);
您正在了解 C(和 C++)如何处理字符串(不是 C++ 的 std::string)的内部结构。
字符串由指向它的第一个字符的指针引用。这是显示这一点的代码:
char *ptr;
ptr = "hello\n";
printf("%s\n", ptr);
ptr++;
printf("%s\n", ptr);