简介:1联合体类型的声明;2联合体的特点;3联合体大小的计算;4枚举类型的声明;5枚举类型的优点;6枚举类型的使用
1 联合体
1.1 联合体类型的声明
像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
给联合体其中一个成员赋值,其他成员的值也跟着变化。
使用联合体的目的是为了节省空间。联合体成员在同一时间只能使用一个。
#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = { 0 };
//计算连个变量的大小
printf("%zd\n", sizeof(un));
return 0;
}
1.2 联合体的大小
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下面输出的结果是什么?
printf("%zd\n", sizeof(union Un1));
printf("%zd\n", sizeof(union Un2));
return 0;
}
1.3 联合体判断大小端
联合体的特点是所有成员共用同一块内存空间,这个特点用来判断大小端很合适。
//使用联合体判断大小端
#include <stdio.h>
int cheak_sys()
{
union
{
char c;
int i;
}n;
n.i = 1;
return n.c;
}
int main()
{
if (cheak_sys())
printf("小端\n");
else
printf("大端\n");
return 0;
}
2 枚举类型
2.1 枚举类型的声明
枚举顾名思义就是一一列举。
把可能的取值一一列举。
比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
月份有12个月,也可以一一列举
三原色,也可以列举
这些数据的表示就可以使用枚举了。
enum Color//颜色
{
RED,
GREEN,
BLUE
}
上面定义的enum Color就是枚举类型。
{}中的内容是枚举类型的可能取值,也叫枚举常量。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
下面是一个赋初值的问题:
枚举默认从0开始,所以X1是0,故Y1是1,给了数字后会根据数字向后推,那么Z1是255,A1是256,所以B1是257。
2.2 枚举类型的优点
我们也可以使用#define定义常量,为什么非要使用枚举?
枚举的优点:
- 增加代码的可读性和可维护性
- 和
#define定义的标识符比较枚举有类型检查,更加严谨。 - 便于调试,预处理阶段会删除
#define定义的符号 - 使用方便,一次可以定义多个常量
- 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用
有关#define:
说明:结构体向最长的char对齐,前两个位段元素一共4+2位,不足8位,合起来占1字节,最后一个单独1字节,一共3字节。另外,#define执行的是查找替换, sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是3*2+3,结果为9。
2.3 枚举类型的使用
enum Color//颜色
{
RED=1;
GREEN=2;
BLUE=4;
};
enum Color clr = GREEN;//使用枚举常量给枚举变量赋值
那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的类型检查比
较严格。