【问题标题】:Pointers for Character Array vs Integer Array in C++C ++中字符数组与整数数组的指针
【发布时间】:2014-07-16 16:23:05
【问题描述】:

我试图理解 C++ 中的指针和数组。我注意到在下面的代码中输出a 正确地给出了array 中第一个元素的地址,但是输出c 给出了pk 而不是地址。

int array[3]={4,7,2};
int * a;

a= array;

char Carray[3]={'p','k','\0'};
char * c;

c= Carray;

cout << a << "\n";
cout << c << "\n";

这是在Carray 中查找第一个元素的地址的错误方法吗?或者这是cout 解释整数和字符数组指针的一些怪癖。

输出:

Ox23fe30
pk

【问题讨论】:

  • 请向我们展示您从这些语句中得到的输出。
  • C 风格的字符串是以空字符 \0 结尾的 char 数组,cout 假设您传递给它的是 C 风格的字符串。所以你获取第一个元素地址的方法是正确的,但是cout 对该地址的解释对于intchar 是不同的。
  • 除非您特别要求与 C 或类似的东西进行比较,否则不要用 C 标记您的 C++ 问题 - 语言及其惯用答案可能会大不相同。

标签: c++ c arrays pointers


【解决方案1】:

这是 cout 如何解释 character 数组的指针的一个怪癖。

当给定一个指针时,cout 将打印地址,除非它是 char*,在这种情况下,它将指针解释为 c 样式字符串(指向以字符数组结尾的指针将是一个空字节)。

要打印 char 数组的地址,首先将其转换为 void*cout &lt;&lt; reinterpret_cast&lt;void*&gt;(c) &lt;&lt; "\n";

【讨论】:

    【解决方案2】:

    使用c,您正在调用operator&lt;&lt;(std::istream&amp;, char*)。这只是打印字符直到它到达'\0',就像一个普通的旧 C 风格的字符串。

    使用aoperator&lt;&lt;(std::istream&amp;, int*) 打印地址。

    【讨论】:

    • 技术上我认为过载是operator&lt;&lt;(std::istream&amp;, void*)
    【解决方案3】:

    这是来自 C 的“怪癖”。在 C 中,字符串是以 null 结尾的 char[]cout 允许使用 C 风格的字符串,因此它会像输出字符串一样输出字符指针。

    【讨论】:

      【解决方案4】:

      cout 解释 char 指针的方式与解释 int 指针的方式不同,因此您获取第一个数组元素地址的方式是可以的。

      【讨论】:

        【解决方案5】:

        在 C 和 C++ 中,指向 char 的指针通常被视为以 NULL 结尾的字符串。对于像 cout 这样的 STL 流,char 指针肯定被视为以 NULL 结尾的字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-13
          • 2017-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多