为什么在动态数组中自动解除对 char 指针的引用

Why is a char pointer dereferenced automatically in a dynamic array

也许是个愚蠢的问题。当我cout指向char数组的指针时,我以为它会打印一个地址;相反,它取消引用地址并打印实际值直到为空。

与 int 数组相反,它按照我的预期进行操作。它打印第一个元素的地址。

为什么打印指针时 char 元素被取消引用。

char* as = new char[100];
    as[0] = 'a';
    as[1] = 'b';
    as[2] = NULL;
    cout << as << endl;

    int* s = new int[100];
    s[0] = 2;
    cout << s << endl;

问这个是因为当我试图获取第一个 char 元素的地址时 a[0] = 'a';。我必须将它存储在指向指针的指针中。这对我来说似乎很奇怪,但这不是重点。

char ** d = &as;
    cout << d << "this is d" << endl;

它打印字符串,因为这是特定 operator<< 重载的定义 所做的 。如果要打印地址,请强制转换为 void *

cout << static_cast<void *>(as) << endl;

IOStreams 对 char*(和 const char*)进行了特殊处理,因此您可以毫不费力地打印 C 字符串:

std::cout << "hello world\n";

(请记住,字符串文字表达式在传递给 operator<< 时会立即衰减为 const char*。)

如果你不想要这种行为,你可以转换为 void*:

char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << (void*)as << endl;

你的"fix"实际上是坏了,因为你打印的是指针as的地址,而不是as指向的数组元素的地址。这由您已经注意到的 char** 类型指示。

没有重载输出运算符 << 打印任何 char 指针的地址,它将所有 char 指针视为字符串。如果要打印指针的地址,需要将其强制转换为void*

std::cout << "Address of string is " << static_cast<void*>(as) << '\n';

在旁注中,代码

char ** d = &as;
cout << d << "this is d" << endl;

而不是 打印字符串的地址,即包含在 as 中的指针,而是打印 where 变量 as 存储在内存中。不太一样。

char* 字符指针被 std::ostream << 运算符视为 C 风格的空终止字符串。你是对的,这是与其他指针类型不同的行为。

&a 不是指向 a[0] 的指针。它是一个指向 a 的指针,它本身就是一个指针。 a 实际上是指向 a[0] 的指针,相当于 &a[0].

<< 运算符被重载以获取 char* 并输出其内容,因为 int*/int[].

没有这样的重载