枚举
1.什么是枚举?
把可能的值列举出来。例如一周的星期一到星期日,可以一一列举。月份有12个月,可以一一列举。
2.枚举类型定义
enum Day { 枚举类型
Mon, 枚举常量
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Color { 枚举类型
RED, 枚举常量
GREEN,
BLUE
};
以上定义的enum Day 和 enum Color都是枚举类型。{}中的内容是枚举类型的可能取值,也叫枚举常量。
enum Color {
RED=1,
GREEN=2,
BLUE=5
};
3.枚举的使用
枚举常量:这些取值都是有值的,默认从0开始,一次递增1。也可以在定义时赋初值。
enum Color {
RED,
GREEN,
BLUE=5,
PINK,
BLACK=7,
};
enum Color c = GREEN; 只能拿枚举常量给枚举变量赋值,
才不会出现类型差异
printf("%d %d %d\n",RED,PINK,c);
c = 6;
printf("%d\n", c);
enum dir {
UP,
DOWN,
RIGHT,
LEFT
};
enum dir c = 7; 枚举的本质就是整数
enum dir d ;
enum dir e = UP;
printf("%d %d %d %d\n",sizeof(c),sizeof(d),sizeof(e),sizeof(UP));
enum dir c=7 硬编码,也是可以通过的
枚举的本质就是整数
4.枚举优点
1.增加代码可读性和可维护性
2.和#define定义的标识符比较,枚举有类型检查,更加严谨 #define MAX 20
3.防止命名污染(封装)
4.便于调试
5.使用方便,一次可以定义多个常量
联合(共用体)
1.联合类型定义
联合也是一种特殊的自定义类型。这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合体也叫共用体)
union Un {
char c;
int i;
};
union Un un;
printf("%d\n", sizeof(un));
2.联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
union Un {
int i;
char c;
};
union Un un;
printf("%p\n", &un);
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
用来判断大小端
c从低地址开辟1字节,写入0x55。该以字节必与int i的4字节中的一部分重叠。在查询i的值为0x11223355,说明低权值位的值写在低地址位处,为小端。
3.联合大小的计算
3.1 联合的大小至少是最大成员的大小
3.2 当最大成员大小不是最大对齐数的整数倍时候就要对齐到最大对齐数的整数倍。
union un {
unsigned int x;
unsigned char a[4];
};
union un o;
o.x=0x11223344;
for (int i = 0; i < 4; i++) {
printf("0x%x\n", o.a[i]);
}
实现对x的分段读取。
192.168.112.153 用于网络
union Un1 {
char c[5];
int i;
};
union Un2 {
short c[7];
int i;
};
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
根据3.1和3.2进行联合体大小的计算
union Un1中:成员char [5] 最大内存为5,对齐数为1,int i内存大小为4,对齐数为4。5非4的整数倍,向4的整数倍对齐,到8。
union Un2同理。