联合(共用体)
4.1联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体,下面是一个栗子:
#include<stdio.h>
union Un
{
int a;//4
char c;//1
};
struct St
{
int a;
char c;
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.a));
printf("%p\n", &(u.c));
return 0;
}
为什么会是相同的地址呢?
a与c共用同一块空间
请看直观图:
而结构体则是两个独立的空间,直观图:
更形象地说,联合的a与c合租同一个房间,睡在同一张床上,而结构体的a和c有独立的房间,并且还有公共区域(浪费的空间)
但是a和c不是同时使用,只能使用a或者c当中的一个
形象地说a与c都使用过同一辆共享单车,但是不会同时使用,a用,c不会用;c用,a不会用
4.2联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
//判断当前计算机的大小端存储
int check_sys()
{
int a = 1;
return *(char*)&a;
}
//之前学过的方法
int main()
{
//int a=1;//0x 00 00 00 01
//低---->高
//01 00 00 00---小端
//00 00 00 01---大端
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
}
//使用联合的方法
int check_sys()
{
union Un
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
4.3联合大小的计算
1.联合的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
举个栗子:
union Un
{
char arr[5];//5,对齐数为1
int i;//4
};
int main()
{
printf("%d\n", sizeof(union Un));
return 0;
}