计算函数内的数组大小?

时间:2016-12-14 10:25:16

标签: c++

#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);

4 个答案:

答案 0 :(得分:6)

  

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

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

答案 1 :(得分:1)

  

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

void ArraySize(int arrMyarr[]);

void ArraySize1(int *arrMyarr);

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

答案 2 :(得分:1)

  

是的,上述两个函数的语法是相同的

在这两种情况下,我们{C}中的数组passing reference to the first elementarrMyarr

即使你在括号内加上一个数字:void ArraySize(int arrMyarr[10]) 10完全被忽略

答案 3 :(得分:1)

请注意,如果您想查看实际尺寸,可以执行以下操作:

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

显示32。

(但是请注意,模板是为每个不同的数组大小实例化的)

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