一、结构体
1、结构体作用
对比数组,数组是元素类型一样的数据集合,而很多时候想用很多类型的数据表示一个整体,这个时候就要用到结构体
2、结构体定义
struct 结构体名称
{
类型1 名称1;
类型2 名称2;
......
};
与下图所示定义结构体后,在main函数中利用“struct 结构体名称 变量名”进行声明,利用“变量名.成员”进行赋值访问,还可以用{ }进行赋值。
在以上的基础上进行一个小练习,只输出成绩高的学生的信息。
3、结构体数组
所谓结构体数组,其实就是将结构体作为作为元素存放到数组中,如下图所示。
【练习】搭建一个选民选票系统,输入三个被选举人的姓名,假设有5个人参与选举,系统要完成被选举人名字的录入票数统计,参与选举人名字录入,且有录入错误提示。
4、结构体指针
通过结构体变量地址来访问该结构体需要一个变量来保持这个地址,这和之前说的指针是一样的,只是指针类型是结构体
对第二节中的第一个练习进行应用结构体指针改造。
对第二节中的第二个练习进行应用结构体指针改造。
针对于上述程序感觉比较混乱,结合之前学的函数、指针、结构体指针等进行初步综合改进,以及对变量函数名进行更有意义的命名,如下图所示。
5、结构体二级指针
将在第三节改进的程序进行进一步改进,如下图所示,利用二级指针进行操作,接下来将下面红色矩形框中的程序封装成函数。
二、联合体
1、联合体引入
联合体,又叫共用体,同一个空间存放类型不同,不同类型的变量共享一块空间。不同于结构体,结构体元素有各自单独的空间,而共用体元素共享空间,空间大小由最大类型确定,这就导致结构体元素互不影响,而共用体值会导致覆盖。
通过上图中联合体TestU1和TestU2可以观察到联合体的空间是由最大类型决定的,而且对于联合体来说,每个元素的地址都是一致的,这就会出现值覆盖的问题,如下图所示。
在程序中观察到对于结构体u2先赋值int_data赋值,再给double_data赋值,输出int_data的值发现其值被double_data覆盖,继续进行测试,对char_data进行赋值,根据规律,应该输出其对应的ASCII值。
2、联合体开发
【练习】有若干个人员的数据,其中有学生和教师,学生的数据包括:姓名、号码、性别、职业、班级,教师的数据包括:姓名、号码、性别、职业、职务,要求用同一个表格来处理。
三、枚举类型
如果一个变量只有几种可能,比如星期几等,此时适合用枚举类型,列表中的名字,可以自己定义,无需像变量一样去申请。C编译器把它当成常量处理,也称枚举常量。
在上图中,对于我的个人理解来说,枚举其实是用字符串来代表整型数据,Sun就代表0,Mon代表1,Tue代表2,...,可以进行数值比较等,如下图所示,0<1,通过判断输出。
还有就是可以对其中的字符串进行赋一个整型的值,其后的字符串所表示的整型值会依次递增,如下图所示。
四、typedef关键字
typedef关键字作用是给已经有的变量类型起名字,一般配合结构体使用,这样做是为了每次不必以struct开头,如下图所示,将结构体struct Test重命名为T,在主函数中直接使用T进行声明。
将上述过程进行简化,可得到下图所示的代码。
下面进行一个typedef与结构体的小应用,如下图所示。
下图改为应用结构体指针