指针
-
数组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求数组的大小。