九、结构体、共用体、枚举、宏定义、预处理
1、结构体
引入关键字:struct
引入操作符:.
a、为什么需要结构体?什么是结构体
没有结构体之前在C语言中数据的组织依靠变量+数组。最初简单的时候,只需要使用基本数据类型(int、char、float、
double)来定义单个变量,需要几个变量就定义几个。后来情况变复杂了,有时候需要很多意义相关的变量(譬如需要存储及
运算一个班级的学生分数)这时候数组出现了。数据解决了需要很多类型相同意义相关的变量的问题。但是数组是有限制的,
数组最大的不足在于一个数组只能存储很多个数据类型相同的变量。
因此碰到需要封装几个类型不同的变量的时候,数组就无能为力了。譬如:【使用一个数据结构来保存学生的所有信
息:姓名、学号、性别。】
b、什么是结构体?
结构体是一个集合,集合中包含了很多元素,这些元素的数据类型可以相同也可以不同。所以结构体是一种数据封装的方法。
结构体的意义就在于,把很多数据类型不相同的变量封装在一起,组成一个大的新的数据类型。
数据结构:把庞大复杂的数据用一定的方式组织管理起来,便于操作(查找、增加、删除等)这就叫数据结构。
c、结构体和数组的关联:数组是一种特殊的结构体,特殊之处在于封装内的各个元素类型是相同的。结构体和数组都是对子元素
的封装,因此定义的时候都是封装作为整体定义,但是使用的时候,都是使用封装中的子元素。一般结构体变量和数组变量都
不会作为一个整体操作。
d、使用结构体的步骤:
第一步:定义结构体类型。结构体类型的定义是在主函数外面的(主函数外面 == 全局)
第二步:使用第一步的类型来定义结构体的变量。
第三步:使用变量实际上使用结构体变量的时候,使用的是结构体中封装的各个子元素,而不是结构体本身。
e、结构体初始化
结构体变量和普通变量一样,作为局部变量时,如果定义时无初始化也无显式赋值,则结构体变量中子元素的值是随机的。
有两种C语言接受的结构体初始化方式:
第一种:完全初始化。例:{xx,xx,xx,xx};
第二种:部分初始化。
例:
{
.a = xx,
.b = xx,
.c = xx,
.d = xx,
};
2、宏定义
#define N (321) //宏定义的格式
宏定义要注意的问题:
1、宏定义一般是在函数外面
2、宏定义必须要先定义,再使用宏。如果先使用就会编译报错。
3、宏定义中宏名一般用大写。不是语法规定的,是一般约定俗成的。
为什么要使用宏定义?
在C语言中,一般使用常数的时候,都不是直接使用,而是先把该常数定义为一个宏,然后在程序中使用该宏名。这样
做的好处是,等我们需要修改这个常数时,只需要在宏定义出修改一次即可。而不用到代码中到处去寻找,看哪里使用过
这个常数。
3、枚举
4、共用体(union,联合,联合体)
引入关键字:union
共用体union在定义和使用形式上,和结构体struct很相似。但是两种数据结构是完全不同的两类东西。
结构体,是对多个数据的组合与封装。
共用体,共用体中只有一个东西,只是被好几个名字(和类型)共用。