除了可以用数组元素作为函数参数外,还可以用数组名作为函数参数(包括实参和形参)。
注意:用数组元素作实参时,向形参变量传递的数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
【例题1】
有一个一维数组score,内放10个学生成绩,求平均成绩。
【思路】
用一个函数Average来求平均成绩,不用数组元素作为函数实参,而是用数组名作为函数实参,形参也用数组名,在Average函数中引用各数组元素,求平均成绩并返回main函数。
【代码实现】
float Average(float arr[10])//定义Average函数
{
float sum = arr[0];
for (int i = 1; i < 10; i++)
{
sum = sum + arr[i];//累加学生成绩
}
float aver;
aver = sum / 10;
return aver;
}
int main()
{
float score[10];
printf("输入10个学生的成绩:\n");
for (int i = 0; i < 10; i++)
{
scanf("%f", &score[i]);
}
float average;
average = Average(score);//调用Average函数
printf("这10个学生的平均成绩为:%.2f\n", average);
return 0;
}
【运行结果】
【程序分析】
(1)用数组名做函数参数,应该在主调函数和被调函数分别定义数组,上例中arr是形参数组名,score是实参数组名,分别在其所在函数中定义,不能只在一方定义。
(2)实参数组与形参数组类型应一致(上例中都为float型),如不一致,结果将出错。
(3)在定义Average函数时,声明形参数组的大小为10,但实际上,指定其大小是不起任何作用的,因为C语言编译系统并不检查形参数组大小,只是将实参数组的首元素的地址传给形参数组名。形参数组名获得了实参数组的首元素的地址,由于数组名代表数组首元素的地址,所以认为,形参数组首元素(arr[0])和实参数组首元素(score[0])具有同一地址,它们共占同一存储单元,score[n]和arr[n]指的是同一单元。score[n]和arr[n]具有相同的值。
(4)形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号,如:float Average(float arr[10])
,效果是相同的。
【例题2】
有两个班级,分别有n、m个学生,调用Average函数,分别求这两个班学生的平均成绩。
【思路】
例题1已经解决了求一个有确定长度的数组的平均值的问题。现在需解决求一个未知长度的数组的平均值的问题。在定义Average函数时不必指定数组的长度,在形参表中增加一个整型变量n,从主函数把数组的实际长度从实参传递给形参n。
【代码实现】
float Average(float arr[], int n)//定义Average函数
{
float sum = 0;
float aver;
for (int i = 0; i < n; i++)
{
sum += arr[i];//累加学生成绩
}
aver = sum / n;
return aver;
}
int main()
{
float Average(float score[], int n);
int n,m;
printf("请输入第一个班学生个数:\n");
scanf("%d", &n);
float score1[100],score2[100];//定义两个长度为100未初始化的数组
printf("请输入第一个班学生的成绩:\n");
for (int i = 0; i < n; i++)
{
scanf("%f", &score1[i]);
}
float average1=Average(score1, n);//用数组名score1和n作为实参
printf("第一个班学生的平均成绩是%.2f\n", average1);
printf("请输入第二个班学生个数:\n");
scanf("%d", &m);
printf("请输入第二个班学生的成绩:\n");
for (int i = 0; i < m; i++)
{
scanf("%f", &score2[i]);
}
float average2 = Average(score2, m);//用数组名score2和m作为实参
printf("学生的平均成绩是%.2f", average2);
return 0;
}
【运行结果】