据我所知,由于在cstring中包含了后缀\ 0 sentinel值,因此字符数组与cstring不同。 但是,我也理解,在cstring,chars数组或任何其他类型的数组的情况下,程序中的数组标识符是指向数组的指针。 所以,下面是完全有效的。
char some_c_string[] = "stringy";
char *stringptr;
stringptr = some_c_string; // assign pointer val to other pointer
我不明白为什么std::cout
会自动假设我想在cstring或chars数组中输出每个元素的值,而不是十六进制地址。例如:
char some_c_string[] = "stringy"; // got a sentinel val
char charArray[5] = {'H','e','l','l','o'}; // no space for sentinel val \0
char *stringptr;
stringptr = some_c_string;
int intArray[3] = {1, 2, 4};
cout << some_c_string << endl << charArray << endl
<< stringptr << endl << intArray << endl;
会导致输出:
stringy
Hello
stringy
0xsomehexadd
因此对于cstring和char数组,std::cout
给了我每个元素的值,而不是像int数组那样的十六进制地址。
我想这是为了方便而成为C ++的标准。但有人可以扩展1)当这成为标准。 2)std::cout
如何区分char / cstrings和其他数组。我猜它使用sizeof()
来查看它是一个单字节数组,每个数组元素的值是一个ASCII int值来标识一个chars / cstring数组。
谢谢! :d
答案 0 :(得分:4)
没有任何花哨的事情发生。 operator<<
对char*
有一个特殊的重载,因此您可以执行std::cout << "Hello World";
。从c ++第1天开始就是这样。
对于char*
以外的任何内容,指针地址显示为十六进制。
如果您想显示char*
的地址,只需将其转换为void*
,即
std::cout << (void*)"Hello World";