我先将代码修改完善下,原来的没办法执行:
#include <iostream>
using namespace std;
void doublesort(int arr[]) {
cout << sizeof(arr[0]) << endl;
cout << sizeof(arr) << endl;
cout << arr[8] << endl;
int len_arr = sizeof(arr) / sizeof(arr[0]);
cout << len_arr << endl;
for (int i = 0; i < len_arr ; i++)
{
for (int j = i; j < len_arr - i -1; j++)
{
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main() {
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
cout << sizeof(arr[0]) << endl;
cout << sizeof(arr) << endl;
doublesort(arr);
system("pause");
return 0;
}
其他部分应该都好理解,核心是看一下void doublesort(int arr[]) 中的参数int arr[]到底传入的是什么:
数组作函数参数时,C语言标准规定,作为“类型的数组”的形参应该调整为“类型的指针”。在函数形参定义这个特殊情况下,编译器必须把数组形式改写成指向数组第 0 个元素的指针形式。编译器只向函数传递数组的地址,而不是整个数组的拷贝。
在函数内部,arr 会被转换成一个指针变量,编译器为 arr 分配 4 个字节的内存,用 sizeof(arr) 求得的是指针变量的长度,而不是数组长度。要想在函数内部获得数组长度必须额外增加一个参数专门用于传入数组的长度。
参数传递是一次赋值的过程,赋值也是一个表达式,函数调用时不管传递的是数组名还是数组指针,效果都是一样的,相当于给一个指针变量赋值。
C语言之所以把作为形参的数组和指针等同起来是出于效率方面的考虑。数组是若干类型相同的数据的集合,数据的数目没有限制,可能只有几个,也可能成千上万,如果要传递整个数组,无论在时间还是内存空间上的开销都可能非常大。而且绝大部分情况下,我们其实并不需要整个数组的拷贝,我们只想告诉函数在那一时刻对哪个特定的数组感兴趣。
|