为什么在动态数组中自动取消引用char指针

时间:2015-04-08 16:31:25

标签: c++ c-strings

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

与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;

5 个答案:

答案 0 :(得分:2)

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

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

在旁注,代码

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

它打印字符串,因为该特定operator<<重载的定义是什么。如果要打印地址,请转换为void *

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

答案 3 :(得分:1)

IOStreams特别对待char*(和const char*),这样您就可以毫不费力地打印C字符串:

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

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

如果您不想要此行为,可以转换为void*

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

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

答案 4 :(得分:0)

&lt;&lt;运算符重载以获取char*并输出其内容,因为int* / int[]没有此类重载。