参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,
所以数组作为参数传递给函数的只是数组首元素的 地址,函数在需要用到后面元素时再按照这个地址和数组下标去查找。
也就是说后面的元素根本没到函数里来,所以在函数里求不出数组的大小也就不足为奇了。
/******因此写形式参数时既可以 int array_length(int a[]){ return 0; } *******/ /*******也可以 int array_length(int *a){ return 0; } *******/
而此时(在子函数中)再用sizeof(a),则得到的是指针的长度(这里“指针的长度”这个表述可能有问题,该怎么精确表达呢?), 由于是64位的机子,地址为64位,也就是指针为64位,即8(字节) (sizeof(a[0]) 还是4, 其中a[]是int型数组) 另一方面,在子函数中另外的操作,比如拿数组名当指针用的 a++,还是和main()里面一样#include <iostream> void length(int a[]){ cout<<sizeof(a[0])<<endl; cout<<*a++<<endl; cout<<*a++<<endl; cout<<*a++<<endl; } int main(int argc, const char * argv[]) { int a[]={65,66,67,68,1,1,2,10,15,7,1}; length(a); return 0 } //输出的结果是 // 4 // 65 // 66 // 67
输出结果显示,子函数内还是按照首地址以及数组类型的长度来递增。 如果是排序,在子函数里面修改了地址所对应的内容,主函数再调用的时候内容也已经变了,也就是对内存中的数据进行了操作,影响了实参。所以可以不用返回数组什么的,直接用void 类型的子函数就好了。 三、 最后,总结一下解决方案 (假设有 int a[5];)Solution 1.1: //to get the length of the array int length = sizeof(a)/sizeof(a[0]); Solution 1.2: 如果子函数中要用到数组长度,还是如这篇文章所说: 一般是先在外面把数组长度算好了,再作为作为参数传进去。
//至于用 宏定义 / 类 等方法,以后再研究 //再加一句,能用google就不要用度娘,搜索质量高的不是一点半点,省下的时间不是一点半点。 附:1). mac如何显示是 32位/64位机器:2). 32位机指针为什么是4个字节 64位与32位机的区别