c++函数中的数组参数和sizeof问题

指针

  • 数组nums

    nums 0x61fe14
    num[0] 1
    &nums 0x61fe14
    *nums 1

函数的数组参数

  • 数组被作为参数传递时会退化为指针,如果用sizeof得到的实际上只是指针占据的空间,无法得到数组的长度。

直接在函数体中用sizeof的结果

#include<bits/stdc++.h>
using namespace std;

int f(int arr[])
{
    cout<<sizeof(arr)/sizeof(*arr)<<endl;
}
int main()
{
    int nums[]={1,2,3,4};
    f(nums);
}
>>>
2
  • 加上数组引用,这里数组已经不会被退化为指针了,而是int(&)[]的类型,但这是不完整类型,无法自动匹配int[3]。

int foo(int (&arr)[])

报错

解决办法

使用模板让参数变为完整的类型

#include<bits/stdc++.h>
using namespace std;
template<int len>
int f(int (&arr)[len])
{
    cout<<sizeof(arr)/sizeof(*arr)<<endl;
}
int main()
{
    int nums[]={1,2,3};
    f(nums);
}

template函数模板

分析原因

形参是实参的一份拷贝,是局部变量。但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。所以不能在test()函数内部用sizeof求数组的大小。

猜你喜欢

转载自www.cnblogs.com/rower/p/12893804.html