union
n.工会;联邦,联盟;协会,俱乐部;联合,合并;
结婚,婚姻;美利坚合众国(the Union);
(数)并,并集;联管节,接头;(印度次大陆)村落联合体;
<英,史>教区联合济贫组织;旗帜上象征国家统一的部分;混纺织物
enumerate
v.列举;枚举;计算
stock
n.库存,存货;股票,股份;原料;
v.备有,存有;摆满,供应;为(枪等火器)装枪托;出新芽
adj.老一套的,陈腐的;(商店)库存的,常备的;(有关)电影资料镜头的
1.联合体
⚀定义
联合体又称共用体,和结构体类似作用都是将不同类型的变量进行集成,从而得到一个新的类型变量,不同的地方就在存储方式上,结构体是为所有类型数据都分配空间,而联合体所有类型数据共用一块空间,且空间的大小为这些类型中所占空间最大类型的大小。
⚁声明方式
union union_name
{number_var;number_var;...
};
- union 创建联合体类型时的关键字
- union_name union_name联合体类型的名字
- number_var number_varible联合体内的成员变量
注意:
- 联合体类型的成员变量不能被初始化。
- union union_name这两个合在一起才被称为联合体类型。
- 联合体的声明一定在使用前进行声明不能在后声明。
- 联合体是成员变量共用一块空间,成员变量的值就会随着其他成员的改变而改变。
例子:
typedef重命名
typedef union S //定义的联合体前加上typedef关键字
{char a;int b;
}S;//在定义完后面加上重新命名的名字
struct Stu S1;//使用struct定义的名字创建变量
Stu S2;//使用typedef重命名的名字创建变量
//不在声明时重命名
typedef union S S;//typedef关键字+原名+新名字;
特殊声明:
struct //不声明结构体类型名字
{char a;int b;
}S1;//创建结构体变量
- 这种在声联合体时不声明联合体类型名,而在声明后接着创建联合体变量的操作就称为联合体的匿名声明。
- 对于这种没有将联合体类型名的联合体,就意味着不能通过联合体类型来创建联合体变量,这种只能使用它后面的联合体变量,可以称为一次性联合体。
⚂变量创建
A.在声明时
B.通过结构体类型
⚃存储形式
联合体是所有成员变量共用同一块空间,且空间的大小为最大成员变量的大小。
⚄使用方式
访问成员操作:
A.操作符' . '
结构体变量名.成员变量名
union_name.number_var_name1;
S1.b = 21;
通过结构体类型变量访问
B.操作符" -> "
结构体指针->成员变量名
union_piont_name.number_var_name1
union S* p;//联合体指针
p->b = 21;
初始化操作:
联合体的初始化与结构体不同,结构体的每个成员都有单独的空间,就意味着每个成员都能初始化,而对于联合体则是共用同一块空间,每个成员变量的变化都会影响到其成员,所以通常则是想用哪个成员时,就单独给它赋值,而不是都拿出来赋值,那没意义。
⚅常见例子
商品的属性:
不同的商品有相同的属性和不同的属性,比如衣服,书籍和手机,他们共有的属性就是价格,库存量等等;而对于衣服单独具有的属性就是尺码,颜色等等,对于书籍就是书名,作者等等,对于手机就是内存,处理器等等。
那么想要将不同商品进行封装,那么就要将相同的属性和不同的属性进行封装,而不同的属性只有特定的商品才能,封装所有不同的属性就会使得结构体的内存大小非常大,这时就可以使用联合体来将不同的属性进行封装,节省空间。
//使用结构体封装商品
struct Cmd
{//共有的属性int price;//价格int stock;//库存量union{struct{int size;//尺寸char color[10];//颜色}clothes;struct{char book_name[20];//书名char author[20];//作者}book;struct{char memory[20];//内存char processor[20];//处理器};}item;};
大小端字节序判断:
2.枚举
⚀定义
枚举是一些字符常量的集合,这些字符常量本质的类型都是int类型,就是一个int数值绑定了一个枚举常量有了另外一个名字,比如星期的一一例举,三原色等等。
⚁声明方式
enum enum_name
{enum_elements 1,enum_elements 2,...enum_elements n //枚举元素
};
- enum 枚举类型创建的关键字
- enum_name 枚举类型的名字
- enum_elements 枚举元素,为字符常量
注意:
- 枚举元素的表面上是字符常量,实际上就是整形数据的别名。
- 若不给枚举元素初始化,那么默认第一个元素为0,往后依次增加。
- 若给枚举元素初始化,该元素后面的元素的整形值依次增加。
- 枚举元素之间是由逗号' , '隔开的,且最后一个后面没有逗号。
- 同一个枚举类型中不得含有相同字符的枚举元素。
- 枚举型是预处理指令#define的替代,宏是在预处理阶段将名字替换成对应的值,枚举则是在编译阶段将名字替换成对应的值。【补充】
例子:
typedef重命名
typedef enum enum_name//在声明的关键字前加上重命名关键字
{enum_elements 1,enum_elements 2,...enum_elements n //枚举元素
}new_enun_name;//在声明完后加上新的名字
⚂变量创建
A.在声明时
enum enum_name{enum_elements 1,enum_elements 2, ...enum_elements n}枚举变量名;
B.通过结构体类型
enum enum_name{enum_elements 1,enum_elements 2, ...enum_elements n};//声明
enum enum_name 枚举变量名;
⚃存储形式
枚举类型在内存中的存储类似于联合体,枚举元素共用一块空间,也就是一个枚举元素的大小,而每个枚举元素事实上就是int类型,就是4个字节,所以对于任何枚举类型的空间大小都是4个字节。
⚄使用方式
- 每个枚举类型的枚举元素事实上就是一个列表,而定义的枚举变量就是在这个列表中取值。
- 对C而言,可以给枚举变量赋值整形数值,而对于C++而言则更加严格,则不能。
- 枚举类型的变量只能使用该枚举类型中定义的枚举元素进行赋值,不能赋值枚举元素以外的值。
⚅枚举的优点
【补充】
- 增加代码的可读性和可维护性。
- 和#define定义的标识符比较枚举有类型检查,更加严谨。
- 便于调试,预处理阶段会删除#define定义的符号。
- 使用方便,一次可以定义多个常量。
- 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。
【转载】
本章内容结束,下章见,拜拜!!!