联合体
联合体的创建
联合体的关键字是union
union S
{
char a;
int i;
};
除了关键字和结构体不一样之外,联合体的创建语法形式和结构体的很相似,如果不熟悉结构体的创建,可以看一下我上一篇的博客关于结构体知识的详解。
联合体的特点
联合体的成员是共用一块内存空间的,这也就是意味着它更节省空间,那也就是说明了联合体的使用,我们一般只对联合体其中一个成员进行赋值和使用,例如有些商品需要标上价格,外观,商品类型等信息时,有一些商品可能外观和商品类型只有一个的存在,这是如果用结构体来定义外观和商品类型这个成员时就会浪费空间,相反用联合体就会大幅度节省空间!
什么叫公用一块内存空间呢?如下图所示(以上面的联合体代码为例):
所以你在使用 i 的时候也会对 a 产生影响,你对 a 的使用也会对 i 产生影响。
联合体的大小计算
不了解对齐数的请看我上一篇文章!!!
举个例子:
#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;
}
运行结果:
小练习
如何使用联合体来判断机器大小端存储?
根据联合体的内存分配,我们可以使用一下代码:
#include <stdio.h>
union s
{
char a;
int i;
};
int main()
{
union s S1;
S1.i = 1;
if (S1.a == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}
枚举
枚举的创建
联合体的关键字是enum
enum COLOR
{
RED,
GREEN,
BLUE
};
枚举的创建形式也是和结构体类似。
枚举常量
还是那上面的代码来举例,枚举内部成员是枚举常量,它们是有值的,一般来说,第一个成员是从0开始的,其他成员一次递增(也就是+1)来进行赋值的,我们来打印一下枚举的成员。
既然是枚举常量,也是说明不能在枚举范围外对枚举常量进行赋值,但是可以在枚举内部进行赋值。
如下代码表示:
enum COLOR
{
RED = 3,
GREEN = 255,
BLUE
};
枚举的优点
总而言之,枚举也是给程序员提供了一种选择,大家根据实际情况合理使用即可!