【C语言基础补充6】结构体、共用体、枚举类型组合类型

引言

在C语言的使用过程中,很早就已经接触结构体、共用体,枚举类型等组合类型。但是由于本人在课堂上学习这一章学的不够仔细,而且使用的也不多,因此特意写下笔记,本次笔记以结构体为主。因为共用体,枚举类型个人觉得还是用的比较少,而枚举类型在C++方面可能会多些。

结构体

为了能够更加方面去描述生活中的许多数据而产生的一种组合类型。比如说:学生管理系统中的学生信息,书店中一本书的详细信息等等。可以使用结构体将信息中的所有数据统合在一起。
结构体的语法例子:

struct student 
{
	char name [32];
	int age;
	char gender;
	double score;
};
  1. struct是结构体的关键字
  2. 创建的变量类型名字:student
  3. 结构体的定义部分:name、age、gender、score等,可以包含int、char、double、甚至结构体本身等类型都可以,唯独一样不可包括函数,因为包含函数的就不是结构体了,而是C++中的类所特有的。
  4. 最后的分号()千万不能忘!

以类比普通变量的方式深入理解结构体

在创造结构体的时候,其实也有为大家考虑,结构体在使用的过程中,目标就是要让用户使用结构体像使用普通变量一样。
【C语言基础补充6】结构体、共用体、枚举类型组合类型_第1张图片

结构体的初始化:

【C语言基础补充6】结构体、共用体、枚举类型组合类型_第2张图片
以上介绍了三种结构体的初始化赋值方法。
第三种方法在C++中也能看到,但是在对数组赋值的时候,不能直接使用 等于(=)来给数组赋字符串。

但是,鉴于方法①与方法②的区别:
使用方法①的赋值初始化的方法的软件是不能兼容新版本的
也就是如果后面的有必要往结构体中添加新成员,那么方法①赋值的方法是不能兼容的。
因此,在这里推荐大家使用方法①,方法③两种制定成员赋值方法!

结构体指针

我们一般使用的结构体都比较大,因此,我们一般会使用指针来指向结构体。
这里使用一个函数来负责结构体中数据的输出:
【C语言基础补充6】结构体、共用体、枚举类型组合类型_第3张图片
【C语言基础补充6】结构体、共用体、枚举类型组合类型_第4张图片

结构体中的结构体

有的时候结构体的标签是可以省略的,但是也是有要求的,我们可以在结构体中再定义一个结构体,这时候里面的结构体的标签是可以省略的。
【C语言基础补充6】结构体、共用体、枚举类型组合类型_第5张图片

共用体

共用体与结构体类似,但是共用体与结构体的区别是:

  • 结构体的成员是相互独立的,拥有自己的内存空间。
  • 共用体的成员是共用同一块内存地址,内存空间有可能相互覆盖。
    【C语言基础补充6】结构体、共用体、枚举类型组合类型_第6张图片
    共用体只要对任一成员赋值,那么另一成员的数据可能会被覆盖。
    例如:
    【C语言基础补充6】结构体、共用体、枚举类型组合类型_第7张图片
    代码运行结果:
    【C语言基础补充6】结构体、共用体、枚举类型组合类型_第8张图片
    从上图运行结果可以看到:
  • a的值已经不见了,b的值已经乱码了,只有c的值正确输出
  • 并且共用体x,x.a,x.b,x.c四个的地址都是一样的
  • 因此,共用体的取值,取决于占用空间最大的成员。

共用体的一般使用途径:

  • 定义在结构体中的成员,如果该成员只允许选择其中一个值:例如:选课:只能在成员(语文,数学,英语)中选择一门,因此这里就可以使用共用体。

枚举类型

  • 提高程序可读性
  • 使整数的取值固定在一个范围之内

【C语言基础补充6】结构体、共用体、枚举类型组合类型_第9张图片
【C语言基础补充6】结构体、共用体、枚举类型组合类型_第10张图片

你可能感兴趣的:(C语言基础补充)