自定义类型
枚举
枚举也就是列举,把可能的取值一一列举出来
枚举类型的定义
例:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun,
};
- {}中的内容为枚举类型的可能取值,也叫枚举常量
可能取值是有值的,默认从0开始,依次递增,也可以在定义的时候赋初值
例如:
enum Color//颜色
{
RED = 1,
BLUE = 3,
GREEN = 4,
};
枚举的优点
- 增加代码的可读性和维护性
- 和define定义的标识符比较枚举有类型检查,更加严谨
- 防止命名污染
- 便于调试
- 使用方便,一次可以定义多个常量
枚举的使用
enum Color//颜色
{
RED = 1,
BLUE = 3,
GREEN = 4,
};
enum Color clr=GREEN;
//只能拿枚举常量给枚举变量赋值才不会出现类型差异
clr=5;//错误
联合(共用体)
联合类型的定义
联合类型的成员共用同一块空间
例:
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算联合变量的大小
printf("%d\n", sizeof(un));//4
联合大小的计算
- 联合的大小至少是最大成员的大小
- 当最大成员的大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
例:
int main()
{
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
printf("%d\n", sizeof(union Un1));//8
printf("%d\n", sizeof(union Un2));//16
system("pause");
return 0;
}
应用:将long类型的ip地址转化点分十进制的表示形式
int main()
{
union ip_addr
{
unsigned long addr;
struct
{
unsigned char c1;
unsigned char c2;
unsigned char c3;
unsigned char c4;
}ip;
};
union ip_addr my_ip;
my_ip.addr = 176237845;
printf("%d.%d.%d.%d\n", my_ip.ip.c4, my_ip.ip.c3, my_ip.ip.c2, my_ip.ip.c1);
//结果:10.29.45.21
system("pause");
return 0;
}