引入
前面,我们知道了什么是结构体变量和结构体变量的指针,那么它们能不能在形参中出现,接收主调函数传递过来的值呢?我们现在就一起来看看~
将结构体变量的值传递给另一个函数
其实,结构体变量和结构体变量的指针,甚至结构体变量的成员都可以作为函数参数来使用。
结构体变量的成员作为实参
例如使用 stu[1].name stu[3].num 等结构体变量的成员作为函数参数,进行虚实结合,跟普通变量一样,属于值传递的方式。
注意: 实参和形参的类型要保持一致。
用结构体变量作为实参
用结构体变量做实参,也是采用值传递的方式,结构体变量所占的内存单元的内容全部按顺序传递给形参。所以,形参必须也是相同的结构体类型。
这种方式如果结构体中变量中包含的数据较多,内存开销非常大。
由于采用了值传递的方式,所以,函数中改变了形参的值,也不会反作用到实参中来。 所以使用的非常少。
用指向结构体变量的指针做函数实参
这个非常好奥理解,就是将结构体变量的地址传递给函数,此时函数操作的就是地址后面的数据,可以作用到实参上。
从这里就可以看到,指针的优势了,因为传递的是地址,函数可以直接操作地址后面的数据,从而可以影响到实参的数据。我们也可以只采用
值传递的方式,让函数输出我们需要的数据。非常灵活。
例子
n 个结构体变量,内含学号、姓名和3门课的成绩。要求输出平均成绩最高的学生的信息。包括学号、姓名和3门课成绩以及平均成绩。
#include <stdio.h>
struct Student{
int num;
char name[20];
float score[3];
float ave;
};
int main(){
void input(struct Student stu_input[]);
struct Student max(struct Student stu_max[]);
void print(struct Student stu_printf);
struct Student s[3] , *p;
p=s;
input(p);
print(max(p));
return 0;
}
void input(struct Student stu_input[]){
for(int i=0;i<3;i++){
scanf("%d %s %f %f %f",&stu_input[i].num,&stu_input[i].name,&stu_input[i].score[0],&stu_input[i].score[1],&stu_input[i].score[2]);
stu_input[i].ave=(stu_input[i].score[0]+stu_input[i].score[1]+stu_input[i].score[2])/3;
}
}
struct Student max(struct Student stu_max[]){
int ave_max=0;
for (int i=0;i<3;i++){
if(stu_max[i].ave>stu_max[ave_max].ave){
ave_max=i;
}
}
return stu_max[ave_max];
}
void print(struct Student stu_printf){
printf("平均成绩最好的是%s\n学号:%d\n",stu_printf.name,stu_printf.num);
printf("总平均分:%3.1f\n",stu_printf.ave);
printf("第1门:%3.1f\n第2门:%3.1f\n第3门:%3.1f\n",stu_printf.score[0],stu_printf.score[1],stu_printf.score[2]);
}
输出结果
输入:
1001 bliner-1 98 98 45
1002 bliner-2 98 88 77
1003 bliner-3 85 78 58
平均成绩最好的是bliner-2
学号:1002
总平均分:87.7
第1门:98.0
第2门:88.0
第3门:77.0
解析
上面这个程序有点长,我们来解析一下
全局结构体变量
我们在开始,首先定义了一个结构体变量,由于是再 main 函数之外定义的,所以这是一个全局结构体变量。
我们再结构体变量中存储着三个成绩,我们并没有使用三个 float 变量,而是使用了一个数组。
如果结构体变量内的数据是同一类型重复的,我们可以使用数组来存储。
在最后,我们设置了一个 ave 变量,存储平均成绩。
结构体变量初始化
我们在 main 函数中,初始化了一个结构体数组变量。并且给这个数组设置有3个元素。
然后设置了一个结构体类型的指针变量 p,让 p 指向该结构体变量。注意,指向的是结构体变量,并不是成员。
然后我们在使用 input 赋值的时候,就可以直接操作这个实参了,因为传递过去的是地址,函数操作的是地址后面的数据。
函数调用
我们设计了三个函数input、max和 print。
input,没有返回值,只是让传递过去的地址能够获取到数据。同时计算了成绩的平均数,并赋值给了地址后面的数据。
max 函数很简单,将 input 中存储好的 ave 数据进行比较,然后记住是结构体数组中的哪一个。
特别需要注意的是:
max 的返回值,是一个结构体变量。print 接收的也是一个结构体变量。
print 接收到结构体变量后,按照要求输出其成员即可。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。
评论