一.枚举
枚举的意思就是列举,将每一个可能的取值都进行一一列举。在我们的现实生活中,星期可以列举,颜色可以列举,月份也可以列举,其实存在很多可以列举的事物。当我们列举时,就可以用到枚举。
1.枚举类型的定义
枚举类型的定义如下列代码:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Color//颜色
{
RED,
GREEN,
BLUE,
};
以上我们所定义的 enum Day
和 enum Color
都是枚举类型。 { }中的内容是枚举类型的可能取值,也叫做枚举常量。这些枚举常量在一开始是有默认取值的,默认值都从 0 开始升序,每次增加 1 ,当然我们在定义的时候也可以对这些枚举常量赋初值。例如:
enum Day
{
Mon = 1,
Tues = 2,
Wed = 3,
Thur = 4,
Fri = 5,
Sat = 6,
Sun= 7
};
切记,在枚举类型定义时,{}里面的常量后加的是逗号,而不是分号。由于习惯原因可能会出现这种错误,要特别注意。
2.枚举的优势
很多人都在想为什么我们可以用 #define
定义常量,那为什么还要用枚举。枚举常量和#define的区别:
(1).增加代码的可读性和可维护性 。
(2) 和#define定义的标识符比较枚举有类型检查,更加严谨。(类型不同就不可以赋值)
(3) 防止了命名污染(封装) 。(为防止冲突,#define是全局的,枚举是局部的)
(4) 便于调试 。(#define不能调试)
(5) 使用方便,一次可以定义多个常量。
二.联合(共用体)
1.联合类型的定义
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。比如:
union Un //联合类型的声明
{
char c;
int i;
};
union Un un;//联合变量的定义
2.联合的特点
union Un
{
int i;
char c;
};
union Un un;
//由于i和c是共用内存,所以他们的地址是一样的
un.i = 0x11223344;
un.c = 0x55;
//因为小端存储,所以i的值会变为0×11223355
3.联合大小的计算
在结构体介绍时说到过对齐数,那联合体也是要根据对齐数来计算大小:
1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
例如:
union Un1
{
char c[5];
int i;
};
联合体Un1的大小为8,首先char c[5]
的大小为5,每个成员大小为1,VS中默认对齐数为8,取最小值为1,所以它存储的地址为 0-4。int i
大小为4,但由于他们共用内存,所以i存储地址为 0-3。由于最大默认对齐数为4,所以该联合体大小为8。