数组如何作为形参传给函数?
刚学c++,对这方面也了解的不深入,写的可能有些不对,希望指点!
关于这个问题,可以说一直纠结了我许久,每次我想用数组作为形参传给函数时,发现总是出错,今天又遇到这个问题了,我就来分享下我的思路。
我是想写一个函数用于数组排序用的;传入的数组大小不确定,于是我想用sizeof(a)/sizeof(a[0])
方法测出数组的长度,后来测试,在函数里面测出实参的长度行不通。经过百度查询,终于弄清楚了。
原因:有两种传递方法,一种是function(int a[]); 另一种是function(int *a,int m(数组的大小))
这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值!
对于第一种,根据之前所学,形参是实参的一份拷贝,是局部变量。但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。所以,这里也不能在函数内部用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当作一个指针使用。
void paixu(int a[])
{
for(int i=0;i<10;i++)
{
cout<<*a<<endl;
a++;
}
}
不过这种方法很鸡肋,必须要提前知道数组有多长。
最不该关注的是你的天赋,最应该关注的是你的坚持。