关于c ++:为什么在动态数组中自动取消引用char指针

Why is a char pointer dereferenced automatically in a dynamic array

本问题已经有最佳答案,请猛点这里访问。

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

而不是一个int数组,它执行我所期望的操作。它打印第一个元素的地址。

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

1
2
3
4
5
6
7
8
9
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';时。我必须将它存储在指向指针的指针中。我觉得这很奇怪,但这也不重要。

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


char*字符指针被std::ostream<<运算符视为C样式的以空结尾的字符串。这与其他指针类型的行为不同,这是正确的。

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


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

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

在旁注中,代码

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

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


iostreams专门处理char*const char*,这样您就可以打印C字符串,而无需进一步努力:

1
2
std::cout <<"hello world
"
;

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

如果您不想这样做,可以将其强制转换为void*

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

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


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

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

int*/int[]没有这样的过载时,<<运算符被重载以获取char*并输出其内容。