【问题标题】:Why does cout print char arrays differently from other arrays?为什么 cout 打印 char 数组与其他数组不同?
【发布时间】:2010-10-04 20:21:09
【问题描述】:

我正在使用 C++ 来了解指针的工作原理。我有这段代码使用数组,我使用它只是为了了解等价物如何与指针一起使用。

int main() {    
    int arr[10] = {1,2,3};    
    char arr2[10] = {'c','i','a','o','\0'};
    cout << arr << endl;
    cout << arr2 << endl;
}

但是,当我运行它时,arr 输出整数数组的第一个元素的地址(如预期的那样),但 arr2 不输出字符数组的第一个元素的地址;它实际上打印“ciao”。

我遗漏了什么或者我还没有了解到什么?

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    因为 cout 的 operator &lt;&lt; 被重载以供 char* 输出字符串,而 arr2 与之匹配。

    如果您想要地址,请尝试将字符数组转换为 void 指针。

    【讨论】:

      【解决方案2】:

      虽然强制转换可能是一种更有意义的方法,但您也可以使用 addressof 运算符:

      cout << &arr2 << endl;
      

      【讨论】:

      • 这里可能需要&amp;arr2[0] 而不是&amp;arr2
      • 地址相同,Shawley。
      • C/C++ 中的数组只是一系列内存位置。所以数组的地址就是第一个元素的地址。想知道为什么这被否决
      • 主要是因为它没有解释这个想法 - char[10]* 不会转换为 char*。
      【解决方案3】:

      对于const void*const char*,重载的是运算符const char* 并传递给该重载,因为它比 const void* 更适合。但是,int 数组被转换为 const void* 并传递给该版本。 operatorconst void* 只是输出地址。采用 const char* 的版本实际上将其视为 C 字符串并输出每个字符,直到终止空字符。如果您不希望这样,请在将 char 数组传递给 operator 时将其显式转换为 const void*

      cout << static_cast<const void*>(arr2) << endl;
      

      【讨论】:

      • 根据this 仅对 void* 进行重载。这是否意味着它能够确定指针是否指向字符,如果是,它会查找终端字符并打印字符串? (还是有点难过)
      • @rmp251: 错过these?
      【解决方案4】:

      char* 有一个标准重载,它输出一个以 NUL 结尾的字符串。

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        相关资源
        最近更新 更多