随风而动,随遇而安......
C语言数组作为函数参数-学习十九
02/13
本文最后更新于
2022年08月13日,已超过
783天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
数组元素作函数实参
- 数组元素就是变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,
在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传送。
- 例子:
有两个数组 a,b,各有10个元素,将它们对应地逐个相比(即 a[0] 与 b[0] 比....…)。如果a数组中的元素大于b数组中的相应元素的数目多于 b 数组中元素大于 a 数组中相应元素的数目(如:a[i]>b[i] 3次,b[i]>a[i] 5次,其中i每次为不同的值),则认为a 数组小于 b 数组,并分别统计出两个数组相应元素大于、等于、小于的次数。
#include <stdio.h>
main() {
int large(int x, int y);
int i,c,v=0,m=0,n=0,a[10],b[10];
printf("输入a数组的值:\n");
for (i = 0; i < 10; i++) {
scanf_s("%d", &a[i]);
}
printf("输入b数组的值:\n");
for (i = 0; i < 10; i++) {
scanf_s("%d", &b[i]);
}
for (i = 0; i < 10; i++) {
c = large(a[i], b[i]);
if (c == 1) {
v++;
}
else if (c == -1) {
n++;
}
else {
m++;
}
}
printf("a[i]大于b[i]的个数:%d\na[i]小于b[i]的个数:%d\na[i]等于b[i]的个数:%d\n", v, n, m);
if (v > n) {
printf("a[i]大于b[i]\n");
}
else if(v < n){
printf("a[i]小于b[i]\n");
}
else {
printf("a[i]等于b[i]\n");
}
}
int large(int x,int y) {
int flag;
if (x > y) {
flag = 1;
}
else if(x < y){
flag = -1;
}
else {
flag = 0;
}
return (flag);
}
数组名作函数参数
- 除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参)。
- 用数组元素作实参时,向形参变量传递的是数组元素的值。
- 用数组名作函数实参时,向形参传递的是数组首元素的地址。
- 例子:
有一个一维数组score,内放10个学生成绩,求平均成绩。
#include <stdio.h>
main() {
float score[10], aver;
float average(float array[10]);
printf("输入10个成绩:\n");
for (int i = 0; i < 10; i++) {
scanf_s("%f", &score[i]);
}
aver = average(score);
printf("平均成绩= %.2f\n", aver);
}
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;
}
有两个班级,分别有35名和30名学生,调用一个average函数,分别求这两个班的学生的平均成绩。
- 需要解决怎样用同一个函数求两个不同长度的数组的平均值的问题
#include <stdio.h>
main() {
float score1[5], score2[10], aver1, aver2;
float average(float array[], int n);
printf("输入A班成绩:\n");
for (int i = 0; i < 5; i++) {
scanf_s("%f", &score1[i]);
}
printf("输入B班成绩:\n");
for (int i = 0; i < 10; i++) {
scanf_s("%f", &score2[i]);
}
aver1 = average(score1, 5);
aver2 = average(score2, 10);
printf("A平均成绩= %.2f\nB平均成绩= %.2f\n", aver1, aver2);
}
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;
}
注意
用数组与用数组元素名作函数参数不同点:
1.用数组元素作实参时,对数组元素的处理是按普通变量对待的。
- 用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,
- 都必须有明确的数组说明,当形参和实参二者不一致时,即会发生错误。
2.在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。
- 在函数调用时发生的值传送是把实参变量的值赋予形参变量。
- 在用数组名作函数参数时,不是进行值的传送,是把实参数组的首地址赋子形参数组名,
而不是把实参数组的每一个元素的值都赋予形参数组的各个元素。
用多维数组名作函数参数
- 多维数组元素与一维数组元素一样,可以看作一个变量,所以在调用函数时可以作为实参,进行值的传递。
- 用多维数组名作为函数参数传递的是数组首元素的地址,要求形参是相同类型的同维数组。
- 这里,形参是二维数组时,第二维的大小(长度)必须指明,而第一维的大小(长度)可以指明,也可以不指明。
例如:
int array[5][10]
int array[][10]
求出3X4的矩阵(二维数组)中的最大元素。
#include <stdio.h>
main() {
int max(int array[][4]);
int a[3][4] = { {1,5,7,9},{2,6,12,10},{15,16,33,4} };
printf("最大值= %d\n", max(a));
}
int max(int array[][4]) {
int i,j,n;
n = array[0][0];
for(i=0;i<3;i++){
for (j = 0; j < 4; j++) {
if (n < array[i][j]) {
n = array[i][j];
}
}
}
return n;
}