结构体作为函数参数
当结构体作为函数参数时,参数传递的方式为“传值调用”,即将当前的值复制一份给函数的接口参数。
示例如下:
/*
* 需求:给定2个学生的信息,包括姓名、学号及5门课的成绩,要求利用函数计算每个学生的平均成绩
*
*/
#include <stdio.h>
// 定义结构体类型
struct Student
{
char name[100];
long num;
float grades[5];
float ave;
} ;
void calc_average(struct Student s); // 计算单个学生的平均成绩
void calc_array_average(struct Student s[]); // 对多个学生计算每个人的平均成绩
int main()
{
int i;
struct Student s[2] = { //声明并初始化2个学生的数据
{
"ZhangSan", 10001, {60,70,80,90,100}, 0
},
{
"Lisi", 10002, {60, 70, 60, 70, 60}, 0
}
};
// calc_array_average(s[0]); // 计算单个学生的平均成绩,参数为单个结构体,此时输出的结果为0
calc_array_average(s); // 将结构体数组作为参数,为每个学生计算平均成绩,此时能得到正确的结果
for (i = 0; i < 2; i++) // 输出每个学生的平均成绩
printf("s[%d].ave=%f\n", i, s[i].ave);
return 0;
}
void calc_average(struct Student s) // 传值调用
{
int i;
float sum = 0;
for (i = 0; i < 5; i++)
sum += s.grades[i];
s.ave = sum / 5;
}
void calc_array_average(struct Student s[]) // 传引用调用,因为数组名是常量指针,传递的是地址
{
int i, j;
float sum = 0;
for (i = 0; i < 2; i++)
{
for (j = 0,sum = 0; j < 5; j++)
{
sum += s[i].grades[j];
}
s[i].ave = sum / 5;
}
return;
}