联合体
联合体的定义
联合体是一种特殊的自定义类型,这种类型定义的变量也包含着许多成员(类型可以不同),特点是这些成员共用着同一块内存空间。
例如:
union My //定义联合体类型
{
char c;
int i;
};
union My un; //定义联合体变量
int main()
{
printf("%zd\n", sizeof(un)); //计算联合体变量大小
return 0;
}
联合体的特点
联合体的成员是共用同一块内存空间的,即联合体的大小至少是最大成员的大小。
union Un
{
char a;
int i;
}un;
int main()
{
printf("%p\n", &(un.a)); //查看一下两个成员的地址
printf("%p\n", &(un.i));
return 0;
}
由此也验证了,它门共用的是同一块内存空间。
联合体大小的计算
- 联合体大小至少是最大成员的大小
- 当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。
例如:
union Un1
{
char c[5]; //最大成员是5,最大对齐数是四,所以对齐到8
int i;
};
union Un2
{
short c[7]; //最大成员是14,最大对齐数是4,所以对齐到16
int i;
};
int main()
{
printf("%zd\n", sizeof(union Un1));
printf("%zd\n", sizeof(union Un2));
return 0;
}
使用案例
int daxiao()
{
union Un
{
char a; //一个字节
int i; //四个字节
}un;
un.i = 1;
return un.a;
}
int main()
{
int ret = daxiao();
if (ret)
printf("小端");
else
printf("大端");
return 0;
}
读取的第一个字节是一就是小端存储,是0就是大端存储。