刚学c++,对这方面也了解的不深刻,写的可能有些不对,但愿指点!
关于这个问题,能够说一直纠结了我许久,每次我想用数组做为形参传给函数时,发现老是出错,今天又遇到这个问题了,我就来分享下个人思路。
我是想写一个函数用于数组排序用的;传入的数组大小不肯定,因而我想用sizeof(a)/sizeof(a[0])
方法测出数组的长度,后来测试,在函数里面测出实参的长度行不通。通过百度查询,终于弄清楚了。
缘由:有两种传递方法,一种是function(int a[]); 另外一种是function(int *a,int m(数组的大小))c++
这两种两种方法在函数中对数组参数的修改都会影响到实参自己的值!数组
对于第一种,根据以前所学,形参是实参的一份拷贝,是局部变量。可是数组是个例外,由于数组的数据太多了,将其一一赋值既麻烦又浪费空间,因此数组做为参数传递给函数的只是数组首元素的地址,数据仍是在内存里的,函数在须要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。因此,这里也不能在函数内部用sizeof求数组的大小,必须在外面算好了再传进来。为了方便,下面分析方法二。函数
实例:测试
void pai(int a[],int m) { int tem; for (int i=0;i<m;i++) { int mix=i; for(int j=i+1;j<m;j++) { if(a[mix]>a[j]) mix=j;//找出最小的数字的位置,注意此处是循环了m-i+1次后在执行下面的交换代码。 tem=a[i];//下面才开始换最小的数 a[i]=a[mix]; a[mix]=tem; } } }
这只是一个函数,在main函数中采用sizeof(a)/sizeof(a[0]
求解所传入的数组的长度,用形参传入函数。指针
int ss[]={111,2,34,4,53,65,34,22,43,45}; int m=sizeof(ss)/sizeof(ss[0]); //cout<<m<<endl; pai(ss,m);
这样便把数组中的排序问题解决了,不过始终感受不方便,不能之接传输数组。第一种方法也能够用:直接把实参a看成一个指针使用。code
void paixu(int a[]) { for(int i=0;i<10;i++) { cout<<*a<<endl; a++; } }
不过这种方法很鸡肋,必需要提早知道数组有多长。排序