目录
- 枚举
- 枚举类型的定义
- 枚举的优点
- 联合(共用体)
- 联合类型的定义
- 联合的特点
- 联合大小的计算
枚举
枚举顾名思义就是一一列举,把可能的取值一一列举
枚举类型的定义
enum Day
,enum Sex
,enum Color
都是枚举类型- {}中的内容是枚举类型的可能取值,也叫枚举常量
- 这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值
例如:
enum Color//颜色
{RED,GREEN,BLUE
};
int main()
{printf("RED = %d\n", RED);printf("GREEN = %d\n", GREEN);printf("BLUE = %d\n", BLUE);return 0;
}
枚举的优点
- 增加代码的可读性和可维护性
- 和
#define
定义的标识符比枚举有类型检查,更加严谨。 - 便于调试
- 使用方便,一次可以定义多个常量
联合(共用体)
联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员
特征是:这些成员公用同一块空间(所以联合也叫共用体)
例如:
//联合类型的声明
union Un
{char c;int i;
};
int main()
{printf("%d\n", sizeof(union Un));union Un un = { 0 };printf("%p\n", &un);printf("%p\n", &(un.c));printf("%p\n", &(un.i));return 0;
}
打印结果为:
联合类型中的成员共用一块地址
在同一时间只能使用一个联合类型中的成员
联合的特点
- 联合的成员是共用同一块内存空间的
- 一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
例:判断大小端存储
union Un
{char c;int i;
};
int main()
{union Un u = { 0 };u.i = 1;if (u.c == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
也可使用匿名共用体进行判断
int check_sky()
{union {char c;int i;}un = { .i = 1 };return un.c;
}
int main()
{int ret = check_sky();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}
联合大小的计算
- 联合的大小至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
例如:
union Un
{short c[7];int i;
};
int main()
{printf("%d\n", sizeof(union Un));return 0;
}
打印结果为:16
分析:
- 共用体类型中的
short c[7];
需要14个字节(7(元素)*2(short
类型))
c
的对齐数为2(short
类型),VS默认的对齐数为8,所以c
成员的对齐数为2- 共用体类型中的
int i;
i
的对齐数为4(int
类型),VS默认的对齐数为8,所以i
成员的对齐数为4- 共用体中的最大对齐数为4
共用体中最大成员的大小为14,不是4的倍数,所以共用体的大小为16
对齐数在结构体详解中的结构体的内存对齐规则中有详细解释