函数的参数不仅仅可以使用变量,还可以使用数组。数组元素作为函数的实参,其用法与变量相同。此外,数组名也可以作为函数的实参,传递的是数组元素的首地址。
首先看数组元素作为函数的实参。
例子 有两个数组a和b,各有10个元素。将它们对应逐个比较,如果a数组中的元素大于b数组中相应元素的个数大于a数组中的元素小于b数组中相应元素的个数,则称a数组大于b数组,并统计出两个数组相应元素大于、小于、等于的次数。
#include<stdio.h>
int large(int x, int y) //用于比较两个数的大小
{
int flag;
if(x > y)
{
flag = 1;
}
else
{
if(x < y)
{
flag = -1;
}
else
{
flag = 0;
}
}
return flag;
}
int main(void)
{
int a[10],b[10];
int i;
int m=0, n=0, k=0;
printf("input array A:");
for(i=0; i<10; i++)
{
scanf("%d", &a[i]);
}
printf("\n");
printf("input array B:");
for(i=0; i<10; i++)
{
scanf("%d", &b[i]);
}
for(i=0; i<10; i++) //进行两个数组的比较
{
if(large(a[i], b[i])==1) //a的元素大于b的元素
{
m = m + 1;
}
else
{
if(large(a[i], b[i])==0) //a的元素等于b的元素
{
n = n + 1;
}
else //a的元素小于b的元素
{
k = k + 1;
}
}
}
printf("a[i]>b[i] %d times\n",m);
printf("a[i]<b[i] %d times\n",k);
printf("a[i]=b[i] %d times\n",n);
if(m > k)
{
printf("array A is larger than array B\n");
}
else
{
if(m < k)
{
printf("array A is smaller than array B\n");
}
else
{
printf("array A is equals to array B\n");
}
}
return 0;
}
从程序中可以看出,数组元素作为函数large()的实参。
数组名作为函数参数
例子 有一个一维数组score,内放10个学生成绩,求平均成绩。
#include<stdio.h>
float average(float a[10]) //求平均值的函数
{
int i;
float sum, aver;
sum = a[0];
for(i=1; i<10; i++) //从1开始计数
{
sum = sum + a[i];
}
aver = (float)sum / 10;
return aver;
}
int main(void)
{
int i;
float score[10], aver;
printf("input 10 scores:");
for(i=0; i<10; i++)
{
scanf("%f", &score[i]); //注意是%f,因为score[i]是float型的。
}
aver = average(score);
printf("average is %5.2f\n",aver);
return 0;
}
给几点说明:
(1)用数组名作函数参数,应该在主调函数和被调函数用函数分别定义数组,例子中,a是形参数组名,score是实参数组名,分别在相应的函数中定义,不能只在一方定义。
(2)实参数组与形参数组的类型应一致,否则结果会出错。
(3)实际上,指定数组的大小是不起任何作用的,因为C语言编译对形参数组的大小不做检查,只是将实参数组的首地址产给形参数组。因此,形参数组名获得了实参数组元素的首地址,所以,形参数组首元素和实参数组首元素共有同一地址,它们共占同一存储单元。
(4)形参数组可以不指定大小,在定义数组的时候在数组名后面跟一个方括号就可以了。有时为了在被调用函数中处理数组元素的需要,可以另设一个形参,传递需要处理的数组元素的个数。所以,上面的例子可以修改为:
#include<stdio.h>
int main(void)
{
float average(float array[], int n);
float a_1[5] = {11.0, 54.2, 47.2, 69.5, 58.4};
float a_2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
printf("average of a_1 is %5.2f\n", average(a_1, 5));
printf("average of a_2 is %5.2f\n", average(a_2, 10));
}
float average(float a[], int n)
{
int i;
float aver, sum = a[0];
for(i=1; i<n; i++)
{
sum = sum + a[i];
}
aver = sum/10;
return aver;
}
(5)最后强调一点:用数组名做实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组就共用一段内存。形参数组中元素的值如果发生变化会使实参数组元素的值同时发生变化。
例子 用选择法对数组中10个元素进行排序。所谓选择法,就是将10个元素中最小的元素与a[0]对换,然后将剩下9个元素中最小的与a[1]互换……。
#include<stdio.h>
int main(void)
{
int a[10], i;
void sort(int a[], int n); //不用返回值
printf("input an array:");
for(i=0; i<10; i++)
{
scanf("%d", &a[i]);
}
sort(a, 10);
printf("after sorted:");
for(i=0; i<10; i++)
{
printf("%5d",a[i]);
}
printf("\n");
return 0;
}
void sort(int a[], int n)
{
int i, t, k, j;
for(i=0; i<n-1; i++) //i是控制总的循环此数的
{
k = i;
for(j=k; j<n; j++)
if(a[j] < a[k])
k = j; //改变了a[k]的值,现在a[k]是小值了,a[i]是大数值。
t = a[k]; //将a[k]和a[i]的值对调,就完成了大数值和小数值的交换,小数值被提前。
a[k] = a[i];
a[i] = t;
}
}
多维数组元素也可以作为函数参数。可以将多维数组名作为函数的形参和实参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。但是不能把第二维以及其他高维的大小说明省略。二维数组在内存中是按行存放的,所以在定义的时候,一定要指明它有多少列(即一行有多少个元素)。
#include<stdio.h>
int main(void)
{
int max_a(int a[][4]);
int a[3][4] = {{12,5,6,85},{78,52,98,74},{2,65,41,58}};
printf("Max value is %d\n",max_a(a));
return 0;
}
int max_a(int a[3][4])
{
int max, i, j;
max = a[0][0];
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
{
if(max < a[i][j])
{
max = a[i][j];
}
}
}
return max;
}