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

std::cout << cstring; prints value of cstring elements, not cstring hex address. Why?

我知道字符数组不同于 cstring,因为在 cstring 中包含后缀 \0 标记值。 然而,我也明白,在 cstring、字符数组或任何其他类型的数组的情况下,程序中的数组标识符是指向数组的指针。 所以,下面是完全有效的。

char some_c_string[] = "stringy";
char *stringptr;
stringptr = some_c_string; // assign pointer val to other pointer

我不明白的是,为什么 std::cout 自动假设我想输出每个元素的值在 cstring 或字符数组中,而不是十六进制地址。例如:

char some_c_string[] = "stringy"; // got a sentinel val
char charArray[5] = {'H','e','l','l','o'}; // no space for sentinel val [=12=]
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

没什么特别的。 operator<<char* 有一个特殊的重载,所以你可以做 std::cout << "Hello World";。从 c++ 的第一天开始就是这样。

除了char*,指针地址显示为十六进制。 如果要显示一个char*的地址,只需将其转换为void*即可,即

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