C语言中建立数据类型-结构体变量和结构体变量的指针作为函数参数-学习笔记-49

引入

前面,我们知道了什么是结构体变量和结构体变量的指针,那么它们能不能在形参中出现,接收主调函数传递过来的值呢?我们现在就一起来看看~

将结构体变量的值传递给另一个函数

其实,结构体变量和结构体变量的指针,甚至结构体变量的成员都可以作为函数参数来使用。

结构体变量的成员作为实参

例如使用 stu[1].name stu[3].num 等结构体变量的成员作为函数参数,进行虚实结合,跟普通变量一样,属于值传递的方式。

注意: 实参和形参的类型要保持一致。

用结构体变量作为实参

用结构体变量做实参,也是采用值传递的方式,结构体变量所占的内存单元的内容全部按顺序传递给形参。所以,形参必须也是相同的结构体类型

这种方式如果结构体中变量中包含的数据较多,内存开销非常大。

由于采用了值传递的方式,所以,函数中改变了形参的值,也不会反作用到实参中来。 所以使用的非常少。

用指向结构体变量的指针做函数实参

这个非常好奥理解,就是将结构体变量的地址传递给函数,此时函数操作的就是地址后面的数据,可以作用到实参上。

从这里就可以看到,指针的优势了,因为传递的是地址,函数可以直接操作地址后面的数据,从而可以影响到实参的数据。我们也可以只采用值传递的方式,让函数输出我们需要的数据。非常灵活。

例子

n 个结构体变量,内含学号、姓名和3门课的成绩。要求输出平均成绩最高的学生的信息。包括学号、姓名和3门课成绩以及平均成绩。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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 接收到结构体变量后,按照要求输出其成员即可。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!