结论:数组做函数参数时退化为一个指针变量,当我们需要传数组的时候,正确的做法是把数组和数组的有效长度传给函数。
数组做函数参数的几种形式:
一:
void printArray( int arr[] ) {}
二:
void printArray( int arr[10] ) {}
三:
void printArray( int *arr ) {}
为什么说数组做函数参数会退化成一个指针变量?有什么依据?
我们先声明一个数组 :
int arr[] = {1,2,3,4,5,6,7,8,9,10};
然后对数组求大小 :
sizeof(arr) : 40;
这个结果是显而易见的,大小是40字节,10个整型数据类型的大小。
但是,我们把实参arr传递给printArray函数的形参arr以后,再在printArray函数里面对形参arr求大小,包括以上三种函数声明形式:
sizeof(arr[]) : 4;
sizeof(arr[10]) : 4;
sizeof(*arr) : 4;
它们的大小都是4个字节,指针在32位机下也是四个字节。由此可见,数组做函数参数实际上就是把数组的内存的首地址传递给形参,形参是一个指向数组首地址的指针。
所以,初学者喜欢犯的错误就是把数组传递给形参以后,在函数内用sizeof()的方法去求数组的实际大小,这么做求得的大小永远是一个整型数据的大小,所以是错误的。
错误示例:
void fun(int arr / arr[] / / arr[10]*/ ) {
for ( int i = 0; i < sizeof(arr)/sizeof(int); ++i) {
…
}
}
正确示例:
void fun(int arr / arr[] / / arr[10]*/ , int size ) {
for ( int i = 0; i < size; ++i) {
…
}
}