目录
一、联合的定义
联合也是一种特殊的自定义类型
这种类型定义也包含一系列的成员,特征是这些成员公用同一块空间。
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
union Un un;//联合类型的定义
printf("%d", sizeof(un));//计算联合类型变量的大小
return 0;
}
运行结果: 4
二、联合的特点
联合的成员是公用一块内存空间的,那么一个联合变量的大小,至少是最大成员的大小。
那么,联合的成员的地址是一样的吗?
int main()
{
union Un un;//联合类型的定义
//printf("%d", sizeof(un));//计算联合类型变量的大小
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
return 0;
}
运行结果:
再进一步验证:
un.i = 0x112233;
un.c = 0x66;
printf("%x\n", un.i);
运行结果:
这也更加验证了我们之前的结论,并且可以看出来是小端存储的。
三、联合大小的计算
联合大小计算的规则:
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
例如:
union Un1
{
char c[5];//5 1VS8 1
int i;// 4VS8 4
};
union Un2
{
short c[7];//14 2VS8 2
int i; //4VS8 4
};
int main()
{
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
}
运行结果:
四、联合的应用
上面提到了大小端存储的问题,我们可以巧妙的利用联合来判断大小端存储。
我们可以利用1在大小端的存储方式进行判断。
union Un
{
int i;
char c;
};
int main()
{
//利用联合判断大小端存储
union Un u1;
u1.i = 1;
if (u1.c == 1)
{
printf("小端存储!");
}
else
{
printf("大端存储!");
}
}
运行结果: