结构体数组作为函数参数
函数间不仅可以传递一般的结构体变量,还可以传递结构体数组。结构体数组作为函数参数与普通数组作为函数参数一样,都是传递的数组首地址,在被调函数中改变结构体数组元素的成员变量,主调函数中的结构体数组也会跟着改变。
接下来通过一个案例演示如何使用结构体数组作为函数参数传递数据,具体如例1所示。
例1 demo2.c
1 #include <stdio.h>
2 struct Student //定义struct Student结构体类型
3 {
4 char name[50];
5 int studentID;
6 };
7 void printInfo(struct Student stu[],int length) //定义printInfo()函数
8 {
9 printf("printInfo()函数:\n");
10 for (int i = 0; i < length; i++) //利用for打印结构体变量成员值
11 {
12 if (i == 2) //更改第3个元素的成员值
13 {
14 strcpy(stu[i].name, "lily");
15 stu[i].studentID = 6;
16 }
17 printf("%s %d\n", stu[i].name, stu[i].studentID); //输出数组元素
18 }
19 }
20 int main()
21 {
22 struct Student students[3] = {{"Zhang San", 1 }, //定义结构体数组
23 {"Li Si",2},
24 {"Wang Wu", 3}
25 };
26 printInfo(students, 3); //调用printInfo()函数
27 printf("main()函数:\n");
28 for (int i = 0; i < 3; i++) //通过for循环输出结构体数组元素
29 {
30 printf("%s %d\n", students[i].name, students[i].studentID);
31 }
32 return 0;
33 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~6行代码定义了struct Student结构体类型。第7~19行代码定义了printInfo()函数,该函数以struct Student结构体数组和数组大小作为形式参数,在函数内部利用for循环输出结构体数组元素,如果数组有第3个元素,就将第3个元素的成员值改变。第22~25行代码在main()函数中定义大小为3的struct Student结构体数组students并初始化。第26行代码调用printfInfo()函数,传入参数为students数组及其大小。第28~31行代码利用for循环输出结构体数组students各元素的成员值。由图1可知,在printInfo()函数中,修改了结构体数组的第3个元素成员值,在main()函数中,结构体数组students的第3个元素成员值也被修改了。这表明,结构体数组作为函数参数其实传递的是结构体数组的首地址。