2.怎样理解函数中数组的传递?
首先要明确的是:被调用函数中作为形参接收到的数组,就是函数调用时被作为实参的数组。
对接受到的数组元素进行的修改,也会反映到调用时传入的数组中。
举个例子,我们在列出#include<stdio.h>头文件的前提下,定义了一个函数int search(int v[],int n).//n代表我们所要处理的元素个数。并在此函数下针对数组v进行了一系列查找操作,最终返回一个整形值。然后在main函数里,我们也设一个数组v[number(数字)]//在不同的函数中设出的标识符可以相同。 在main函数里执行search(v,number),此时我们可以把这两个函数想象成A,B两个工厂,在main函数中(B厂)我们想要对v进行查找,但是需要A厂的协助,我们要把数组v这批货运到A厂中加工,完工后最后再运回来,也就是说,当程序运行到search(v,number)这一行时,程序会跳转到search函数中执行,返回我们所要找的结果,这批货就加工完成了,接下来程序会把这批加工好的货运回到main函数继续刚才的步骤执行。
运货即传递,哈哈哈
技术细节
- 光说不练假把式,直接上代码!
-
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #define NUMBER 5 //返回元素个数为n的数组v中的最大值 int max_of(int v[], int n) { int i; int max = v[0]; for (i = 1; i < n; i++) if (v[i] > max) max = v[i]; return max; } int main() { int i; int eng[NUMBER];//英语分数 int mat[NUMBER];//数学分数 int max_eng, max_mat; printf("请输入%d名学生的分数:\n"); for (i = 0; i < NUMBER; i++) { printf("[%d] 英语:", i + 1); scanf("%d", &eng[i]); printf(" 数学:" ); scanf("%d", &mat[i]); } max_eng = max_of(eng,NUMBER); max_mat = max_of(mat, NUMBER); printf("英语最高分是%d\n", max_eng); printf("数学最高分是%d\n", max_mat); return 0; }
首先这段代码的目的就是求出英语和数学的最高分,为了迎接main函数中的“货物”,max_of这个厂家要先做好准备,设好形参数组v[]和元素个数n,先假设最大值max是v[0],在利用for循环从v[1]依次遍历到v[n],遍历期间如果遇到比刚才设的max还大,就将其赋给max,遍历结束后的max就是数组v中的最大值了,然后返回max即可。
-
在main函数中,数组eng和mat分别储存英语和数学的分数,max_e和max_m分别代表英语和数学的最高分,max_of(eng,NUMBER)和max_of(mat,NUMBER)分别返回英语和数学的最高分,再分别赋给max_e和max_m即可。
注意
int max_of(int v[],int n)
接收数组的形参的声明为“类型名 参数名[]”,使用别的形参(这里是n)来接收元素的个数。
另外,调用函数是使用的实参,只要写明数组的名称就可以了。我们可以像下面这样理解
在main函数中传递数组eng或者mat给函数mat_of,函数max_of使用v来接收这个数组。
因此,函数调用表达式max_of(eng,NUMBER)中,v[0]代表eng[0]的内容,v[1]代表eng[1]的内容。