【问题标题】:Why is a char pointer dereferenced automatically in a dynamic array [duplicate]为什么在动态数组中自动取消引用char指针[重复]
【发布时间】:2015-04-08 16:31:24
【问题描述】:

也许是个愚蠢的问题。当我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;

【问题讨论】:

  • char 数组 = C 风格的字符串。系统假设(在这种情况下不正确)您要打印字符串本身,而不是字符串的地址。
  • @MarcB:在 cmets 中回答 Argh -.-
  • @LightningRacisinObrit 哦,对不起,我认为问题是为什么cout &lt;&lt; d 打印一个字符串......我想知道这是怎么回事。

标签: c++ c-strings


【解决方案1】:

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

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

顺便说一句,代码

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

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

【讨论】:

  • 所以,如果我想保存第一个元素的地址。我仍然会使用 char * as;但如果我要打印它。我必须打字吗?只是为了澄清
  • @tropicalmemes as 本身是指向您分配的内存的第一个位置的指针。如果你想打印as 指向的地址,那么你必须强制转换它。
  • @tropicalmemes:是的。
【解决方案2】:

char* 字符指针被 std::ostream &lt;&lt; 运算符视为 C 风格的以空字符结尾的字符串。没错,这是与其他指针类型不同的行为。

&amp;a 不是指向 a[0] 的指针。它是一个指向a 的指针,它本身就是一个指针。 a 实际上是指向a[0] 的指针,等价于&amp;a[0]

【讨论】:

  • @MooingDuck:通过标准库的 IOStreams“模块”。
【解决方案3】:

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

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

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

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

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

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

【讨论】:

    【解决方案4】:

    它打印字符串,因为这就是特定operator&lt;&lt; 重载的定义所做的。如果要打印地址,请投射到void *

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

    【讨论】:

      【解决方案5】:

      char* 并输出其内容,因为 int*/int[] 没有这样的重载。

      【讨论】:

      • 不,输出&amp;as 已损坏。看我的回答。
      猜你喜欢
      • 1970-01-01
      • 2011-11-23
      • 2012-01-09
      • 1970-01-01
      • 2018-06-04
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多