C语言的自定义类型除了结构体之外,还有枚举,联合。
枚举
- 顾名思义,就是一一列举。
枚举类型的定义
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
以上定义的 enum Sex , enum Color 都是枚举类型。
{ }中的内容是枚举类型的可能取值,也叫 枚举常量 。这些可能取值都是有值的,默认从0开始,依次递增1,当然在定义的时候也可以赋初值。
例如:
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
枚举的使用:
enum Color//颜⾊色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;/* 只能拿枚举常量量给枚举变量量赋值
才不不会出现类型的差异。*/
枚举的优点
- 增加代码的可读性和可维护性
- 与#define定义的标识符相比,枚举有类型检查,更加严谨。
- 防止命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量。
联合
也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,这些成员公用同一块空间(所以联合也叫共用体)。
比如:
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算联合变量的大⼩
printf("%d\n", sizeof(un));
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小。
- 面试题
写程序判断当前计算机是大端还是小端存储。
union A
{
char i;
int j;
};
int main()
{
union x.j = 1;
if(x.i == 0)
{
printf("大端\n");
}
else
{
printf("小端\n");
}
}
x.j = 1,大端存储为00 00 00 01,如果x.i = 0,说明它的存储形式的确是00 00 00 01
,如果是小端,那么就是反的,存储为01 00 00 00 ,那么x.i = 1
联合大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数整数倍的时候,就要对齐到最大对齐数的整数倍。
联合与结构体的巧妙使用:
//将long类型的IP地址,转为点分十进制的表示形式
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 = 235729910;
printf("%d.%d.%d.%d\n", my_ip.ip.c4, my_ip.ip.c3, my_ip.ip.c2, my_ip.ip.c1);