数组作为函数参数
我们已经知道了可以用变量作为函数参数,此外,数组元素也可以作为函数实参,其用法与变量相同。数组名也可以作为实参和形参,传递的是数组首地址。
1、 数组元素作为函数实参
由于实参可以是表达式形式,数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,是单向传递,即“值传递”方式。
这里给大家一个例子:
例1:有两个数组a,b,各有10个元素,将他们对应的逐个相比(即a[0]与a[0],a[1]与a[1]比…)。如果a数组中的元素大于b数组中的元素的数目多余b数组中的元素大于a数组中的元素的数目,我门则认为a数组大于b数组,现在分别统计出两个数组相应元素大于、等于、小于的次数。
main(){
int large(int x, int y);
int a[10],b[10],i,n=0,m=0,k=0; //定义数组,和一些必要的变量
printf(“enter array a: \n”);
for(i=0; i<10; i++) //输入数组a
scanf(“%d”, &a[i]);
printf(“\n”);
printf(“enter array b: \n”);
for(i=0; i<10; i++) //输入数组b
scanf(“%d”, &b[i]);
printf(“\n”);
for(i=0; i<10; i++){
if(large(a[i],b[i])==1)n=n+1;
else if(large(a[i],b[i])==0)m=n+1;
else k=k+1;
}
printf(“a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n”,n,m,k);
if(n>k) printf(“array a>array b”);
else if(n<k) printf(“array a<array b”);
else printf(“array a=array b”);
large(int x, int y){
int flag;
if(x>y)flag=1;
else if(x<y)flag=-1;
else flag=0;
return flag;
}
}
2、 数组名可以做函数参数
可以用数组名作函数参数,此时实参与形参都应用数组名(或指针变量)。
例2:有一个一维数组score,内放10个学生成绩,求平均成绩。
float average(float array[10]){
int i;
float aver,sum=array[0];
for(i=1; i<10; i++)sum=sum+array[i];
aver=sum/10;
return aver;
}
main(){
float score[10],aver;
int i;
printf(“input 10 scores:\n”);
for(i=0; i<10; i++)scanf(“%f”,&score[i]);
printf(“\n”);
aver=average(score);//数组名作为函数参数
printf(“average score is %5.2f”,aver);
}
说明:
l 用数组名称作函数参数,应该在主调函数和被调函数分别定义数组,本例中array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义。
l 实参数组与形参数组类型应该保持一致(这里都为float型),如不一致,结果将出错。
l 在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C编译器对形参数组大小不做检查,只是检查实参数组的首地址传给形参数组。因此,score[n]和array[n]指的是同一单元。
l 形参数组也可以不指定大小,在定义数组时在数组名后面跟一个空的方括号,有时为了在被调用函数中处理数组元素的需要,可以另设一个参数,传递需要处理的数组元素的个数,上例可以改写为下面的形式:
float average(float array[], int n){
int i;
float aver,sum=array[0];
for(i=1; i<n; i++)sum=sum+array[i];
aver=sum/n;
return aver;
}
main(){
float score_1[5]={98.5,97,91.5,60,55};
float score_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99,5};
printf(“the average of class A is %6.2f\n”, average(score_1, 5));
printf(“the average of class B is %6.2f\n”, average(score_2, 10));
}
可以看出,两次调用average函数时,需要处理的数组元素是不同的,在第一次调用时用一个实参5传递给形参n,表示求前面5个学生的平均分数。第二次调用时,求10个学生平均分。
l 最后应该说明一点:用数组名作为函数实参的时,不是吧数组元素的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共占同一段内存单元。见下图:
|
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
2 |
4 |
6 |
8 |
10 |
12 |
14 |
16 |
18 |
20 |
b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9]
假如a的起始地址为1000,则b数组的起始地址也是1000,显然a和b同占一段内存单元,a[0]和b[0]同占一个内存单元……。由此,我们可以看到,形参数组中各个元素的值如果发生变化会使实参数组元素的值同时发生变化,从上图是很容易理解的。这一点与变量做函数参数的情况是不同的,务必注意!在程序设计中可以有意识地利用这一点,改变实参数组元素(如排序)。
最后,再给出一个例子:用选择排序法对数组中,10个整数按有小到大排序。所谓选择排序就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……,每比较一轮,我们可以找出一个未经排序的数中最小的一个。共比较9论。
a[0] a[1] a[2] a[3] a[4]
3 6 1 9 4
1 6 3 9 4
1 3 6 9 4
1 3 4 9 6
1 3 4 6 9
我们可以看到在执行函数调用语句sort(a,10);之前和之后,a数组各元素的值是不一样的。原来是无序的,执行sort(a,10)之后是有序的。这也就是所谓的形参数组改变也可以使实参数组随之改变。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/163075.html