【问题标题】:Calculating array size inside function? [duplicate]计算函数内部的数组大小? [复制]
【发布时间】:2017-04-29 15:22:52
【问题描述】:
#include <iostream>
void ArraySize(int arrMyarr[])
{
    std::cout << sizeof(arrMyarr) << '\n';
}

void ArraySize1(int *arrMyarr)
{
    std::cout << sizeof(arrMyarr) << '\n';
}

int main()
{
    int arrTemp[] = { 122, 11, 22, 63, 15, 78, 143, 231 };
    std::cout << sizeof(arrTemp) << '\n';
    ArraySize(arrTemp);
    ArraySize1(arrTemp);
    return 0;
}

输出: 32 4 4

以下两个函数声明是否相同?

void ArraySize(int arrMyarr[]);

void ArraySize1(int *arrMyarr);

【问题讨论】:

    标签: c++


    【解决方案1】:

    以下两个函数声明是否相同?

    void ArraySize(int arrMyarr[]);
    
    void ArraySize1(int *arrMyarr);
    

    是的,完全一样。在函数参数的上下文中,arrMyarr[] 隐式转换为*arrMyarr。这就是所谓的“数组衰减为指针”。

    【讨论】:

      【解决方案2】:

      以下两个函数声明是否相同?

      是的,完全正确。数组在传递时会衰减为指向其第一个元素的指针,这就是您看到4 的原因。为防止这种情况,请使用 std:vector::size()std::array (C++11) 作为编译时大小的类 C 数组。

      【讨论】:

        【解决方案3】:

        是的,上面两个函数的语法是一样的

        在这两种情况下,我们 passing reference to the first element 是 C++ 中的一个数组,即 arrMyarr

        即使您要在括号内输入一个数字:在void ArraySize(int arrMyarr[10]) 中,10 也会被完全忽略

        【讨论】:

          【解决方案4】:

          请注意,如果您想查看实际尺寸,可以这样做:

          template<int N>
          void ArraySize2(int (&arrMyarr)[N])
          {
              std::cout << sizeof(arrMyarr) << '\n';
          }
          

          显示 32。

          (但还要注意,模板会针对每个不同的数组大小进行实例化)

          也可以为类型模板化(最终得到所谓的“数组大小”模板)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-10
            • 1970-01-01
            • 1970-01-01
            • 2010-10-17
            • 1970-01-01
            • 2019-08-21
            • 1970-01-01
            相关资源
            最近更新 更多