【问题标题】:Size of array in C/C++C/C++ 中数组的大小
【发布时间】:2020-10-09 14:20:19
【问题描述】:

考虑以下代码:

int main(){
    int arr[] = {1,2,3,7,8};
    int size = sizeof(arr);
    cout << size;
}

我知道上面的代码将打印数组的大小,即 4*5 = 20 字节,但我对此有一点疑问,arr 是指向数组中第一个元素的指针,大小为一个 ptr 变量是 4 个字节,为什么它不在控制台中打印出 4?

即使我们取消引用arr 并打印它,也会打印数组中的第一个元素。

cout << *arr;

那么这个sizeof() 操作符在数组的情况下是如何工作的呢??

【问题讨论】:

  • 数组和指针不是一回事。有时他们会感到困惑,因为数组很容易变成指向其第一个元素的指针。但这并没有在这里发生。
  • 感谢您的编辑。这是一个很好的问题。投赞成票!
  • "arr 是指向数组中第一个元素的指针" - 不,不是。但是,如果在预期指针的上下文中使用arr,它确实衰减 到这样的指针中。在这个例子中不是这样,所以sizeof() 看到整个数组,而不仅仅是指向它的指针。

标签: c++ arrays sizeof


【解决方案1】:

sizeof(arr)arr衰减为指针类型的实例之一。

您可以使用一元加号运算符强制指针衰减:

std::size_t/*a better type*/ size = sizeof(+arr);

【讨论】:

    【解决方案2】:

    arr 是指向数组中第一个元素的指针

    这是一个错误的假设。 arr不是指针。它是一个由 5 个整数组成的数组。

    那么为什么它没有在控制台中打印出 4 呢?

    因为这不是arr 的大小(以字节为单位)。

    那么这个 sizeof() 操作符在数组的情况下是如何工作的呢?

    您会得到类型的大小(以字节为单位)。与其他所有类型相同。

    【讨论】:

      【解决方案3】:

      要完成答案,您还可以使用 C++11 的 std::extent 获取元素数量

      在我的机器上:

      #include <iostream>
      #include <type_traits>
      
      int main()
      {
        int arr[] = {1,2,3,7,8};
      
        std::cout << sizeof(arr) << "\n";
        std::cout << sizeof(+arr) << "\n";
        std::cout << std::extent<decltype(arr)>::value << "\n";
      }
      

      打印:

      20
      8
      5
      

      来自@eeerorika 评论:

      如果你使用 C++17,你也可以使用std::size

      std::cout << std::size(arr); // prints 5
      

      【讨论】:

      • 获取数组元素的大小:std::size(arr)
      • @eerorika 谢谢,我不知道这个! (刚查了一下,也是c++17)。
      • std::extent 更好(更通用),因为它是 constexpr 并且可以在没有实例时与嵌入在结构中的数组一起使用。
      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2018-05-12
      • 2019-12-02
      相关资源
      最近更新 更多