目录
一、联合体(共同体,联合)
定义
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用一块空间,所以也叫共用体。
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));
打印出来4,和三个相同的地址。看他们的内存布局,4个字节,c得占一个,i得占四个,地址都相同,所以说总共占4个字节。
特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)
二、判断当前计算机的大小端存储
#include <stdio.h>
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int a = 1;
int ret = check_sys();
if (1 == ret)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
拿出地址看第一个字节就可。所以需要转换成char类型。还有更好的解决办法,利用联合体
int check_sys()
{
union Un
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
把 i 赋值为1后,c也是1,c为char类型,那么此时查看c的地址即可。
三、联合体大小的计算
联合的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
union Un
{
int a;//4个字节
char arr[5];//5个字节
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
return 0;
}
一条条看。最大成员的大小,那么至少应该是5吧。再看第二条,a的对齐数是4,数组的对齐数看其中的元素对齐数就好,也就是1,我们可以看做写了5个char类型的变量char c1, char c2等等,所以对齐数整体就是4,5不是其倍数,那么就往后浪费3个字节,形成8个字节,所以联合体大小为8。
四、回忆一下
结构体存在对齐
位段不需要对齐
枚举不对齐
联合体需要对齐
结束。