1.问题描述
数组做函数的参数时,在函数体中无法正确计算数组中的元素个数。
#include<iostream>
using namespace std;
void test01(int* arr) //参数也可写为(int arr[])无需指明数组长度
{
int len1 = sizeof(arr) / sizeof(arr[0]);
cout << "数组中元素个数为:" << len1;
}
int main()
{
int a[9] = { 1,2,3,4,5,6,7,8,9 };
test01(a);
}
运行结果>>数组中元素个数为:2
2.原因
经过查找资料,函数中求出数组长度位2的原因主要有以下几点:
1)sizeof是C语言中32个关键字中的一个,注意它是关键字而不是函数!其求值是在编译时进行的,所以不能能够动态的确定一个变量的值。
2)传数组给一个函数,数组类型自动转换为指针类型,因而实际传的是地址,所以系统是不知道该数组是在哪里截止的,因此不会得到数组的长度。
3)数组名的值就是数组首元素的地址,函数中的sizeof(arr)求的时指针所占的内存,指针变量在64位系统下占8个字节,8字节对应64位,刚好可以表示64位系统的寻址范围。所以结果才会是2,而不是常说的整形指针占4字节。
3.分析总结
首先,所有传递给函数的参数都是通过传值方式进行的,传递给函数的都是参数的一份拷贝。
接着,当传递的参数是一个指向某个变量的指针时,函数将对该指针执行间接访问操作(拷贝指针,并访问所指向的内容),则函数就可以修改指向的变量。
数组做函数参数时,只可做实参。
解决函数体内无法求数组长度的方法:
1)将数组长度在函数体外计算,并作为形参传入函数体中。
void test01(int* arr,int len)
2)使用 引用数组 做实参,但是此时必须指明数组长度。
void test01(int (&a)[9] )