枚举
枚举的定义
枚举顾名思义就是列举
比如我们日常生活中:
一年中有12个月份,可以一一列举
一周的周一到周天可以一一列举
人分为男人和女人也可以保密等等
枚举类型的定义
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
BLUE,
GREEN
};
这些枚举类型的可能取值都是有值的,默认从0开始,以此递增1,当然也可以在定义的时候赋初值
例如:
enum Color//颜色
{
RED = 1,
BLUE = 2,
GREEN = 4
};
枚举的优点
- 增加代码的可读性和可维护性
- 和#define定义的标识符比较,枚举有类型检查,更加严谨
- 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
枚举的使用
enum Color//颜色
{
RED = 1,
BLUE = 2,
GREEN = 4
};
enum Color col = GREEN;
col = 5;//使用错误
联合(共用体)
联合类型的定义
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算联合变量的大小
printf("%d\n", sizeof(union Un));//4
联合的特点
联合的成员共用同一块内存空间,这样一个联合变量的大小,至少是最大成员的大小,(因为联合至少得有能力保存最大的那个成员)
联合大小的计算
- 联合的大小至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
比如:
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
面试题:
判断当前计算机的大小端存储
之前我们已经学习过一种方法:
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
学完联合体,我们可以再次掌握一种方法:
int check_sys()
{
union Un
{
char c;
int i;
}u;
u.i = 1;
//返回1,表示小端
//返回0,表示大端
return u.c;
}
int main()
{
int a = 1;
int ret = check_sys();
if (1 == ret)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}