一、枚举
1.枚举类型的定义
enum Tag//枚举类型的声明
{
Mon,//枚举常量
Tues,//与结构声明类似,但是用逗号隔开枚举常量
Wed,
Thur,
Fri,
Sat,
Sun
};//与结构声明相同,使用分号结束
声明之后,枚举常量的值默认为0,1,2,3,4……一个自然数数列。
如果想修改枚举常量的值,可以:
enum Tag
{
Mon=1,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
声明Mon的值为1,Tues的值为2,Wed的值为3……是一个自然数数列的子数列。
2.创建枚举类型变量
enum Day d = Fri;
Fri就是枚举类型常量,可以将这个值赋给枚举类型enum Day的变量d。
由于c的语法检查不严格,将int类型的5直接赋给d时,编译器不报错。
但在c++编译中会报语法错误。
3.枚举的优点
#define的预处理是直接将对应符号替换成一个值,会破坏代码在调试过程中的可视性。
二、联合(共用体)
1.定义
包含一系列的成员,特征是这些成员共用同一块空间。
#include <stdio.h>
union Un {
int a;
char c;
};
int main() {
union Un u;
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &u.a);
printf("%p\n", &u.c);
return 0;
}
这样的打印结果证明了这个特征。
2.联合的特点
成员共用一块空间,那么这样一个联合变量的大小,至少是最大成员的大小,才能使得联合有能力保存最大的那个成员。
这些成员无法同时调用,在修改其中一个成员时,可能会破坏另一个成员的数据。
3.利用共用内存的特征测试大小端
#include <stdio.h>
//测试大小端
int CheckSys() {
union Un {
int i;
char c;
} u;
u.i = 1;
return u.c;
}
int main() {
int ret = CheckSys();
if (ret == 1) {
printf("小端");
} else {
printf("大端");
}
return 0;
}
与匿名结构体相似,存在匿名共用体(无标签,只能使用一次)。
union
{
int i;
char c;
} u;
4.共用体大小的计算
- 至少是最大成员的大小
- 当最大成员大小不是成员最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍
- 数组的对齐数是其元素的对齐数