std :: cout<<为c_string;打印cstring元素的值,而不是cstring十六进制地址。为什么?

时间:2015-10-24 20:09:02

标签: c++ arrays cout c-strings

据我所知,由于在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

1 个答案:

答案 0 :(得分:4)

没有任何花哨的事情发生。 operator<<char*有一个特殊的重载,因此您可以执行std::cout << "Hello World";。从c ++第1天开始就是这样。

对于char*以外的任何内容,指针地址显示为十六进制。 如果您想显示char*的地址,只需将其转换为void*,即

std::cout << (void*)"Hello World";