数组元素作为函数实参
数组元素可以作为函数实参,不能作为函数形参。因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。
程序举例
输入10个数,要求输出其中值最大的元素和该数是第几个数。
解题思路:可以定义一个长度为10的数组。设计一个函数max,用来求两个数中的大者。在主函数中定义一个变量m,m的初值为a[0],每次调用max函数后的返回值存放在m中。用打擂台算法,将数组元素a[1]到a[9]与m比较,最后的到的m就是最大值。
#include<stdio.h>
int main()
{
int max(int x,int y);
int a[10],m,n,i;
printf("please enter 10 integer number:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=1,m=a[0],n=0;i<10;i++)
{
if(max(m,a[i])>m) //若max函数返回值大于m
{
m=max(m,a[i]); //max函数的返回值取代m
n=i; //把数组元素的序号记下来,放到n中
}
}
printf("the largest number is %d\n it is the %dth number \n",m,n+1);
}
int max(int x,int y)
{
return(x>y?x:y);
}
数组名作为函数参数
除了可以用数组元素作为函数的参数外,还可以用数组名做函数参数(包括实参和形参)。应当注意的是:用数组元素作为实参时,向形参变量传递的是数组所对应数组元素的值,而用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址
程序举例
有一个一维数组score,内放10个学生成绩,求平均成绩。
解题思路:用一个函数average来求平均成绩,不用数组元素作为函数实参,而是用数组名作为函数的实参,形参也用数组名,在average函数中引用各数组的元素,求平均成绩并返回main函数。
编写程序:
#include<stdio.h>
int main()
{
float average(float array[10]);
float score[10],aver;
int i;
printf("please enter 10 scores:");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
printf("\n");
aver=average(score); //注意这里调用函数时,向形参传递的是数组首元素的地址
printf("average score is %5.2f\n ",aver);
return 0;
}
float average(float array[10])
{
int i;
float aver,sum=0;
for(i=0;i<10;i++)
sum=sum+array[i];
aver=sum/10;
return(aver);
}
注意:用数组名作为函数参数,应该在主调函数和被调用函数分别定义数组,例如array是形参的数组名,score是实参数组名,分别在其所在函数中定义。
练习题
1 编写函数fun,其功能是:将1~m能被7或11整除的所有整数放在数组a中,并通过n返回这些数的个数。
例如,如果传给m的值是50,则程序输出: 7,11,14,21,22,28,33,35,42,44,49
2 编写函数fun,其功能是将两个两位数的正整数a、b合并成一个整数放在c中。合并的方式是:将a数的十位和个位依次放在c数的十位和千位上,b数的十位和个位依次放在c数的百位和个位上。
例如,当a=45,b=12时,调用该函数后,c=5142.