1、定义:
是一种特殊的自定义类型,包含一系列成员,联合体也叫共同体,成员共同使用同一块内存空间,用关键字union来命名
union S
{
char a;
int b;
};
验证:
通过代码运行发现成员a和b的地址是相同的,共同占用同一块内存空间
![](https://i-blog.csdnimg.cn/blog_migrate/4b1033fbc6d27dc230bbb9e9430ce4bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6a18db3d192e3f19f8011eb7c8141f1e.png)
2、联合体大小的计算
【1】联合体的大小至少是最大成员的大小(因为联合体至少得有能力存储最大的那个成员)
【2】当最大成员的大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
eg:最大成员为char a[5],但是联合体的大小不是5,因为最大对齐数为4,而5不是4的整数倍,因此需要浪费3个字节空间,最终计算出联合体大小为8
![](https://i-blog.csdnimg.cn/blog_migrate/01b1f52ad3d4b97ba9cf947dc594a9ca.png)
3、联合体在内存中的存储
【1】由于联合体的成员共同使用同一块内存空间,因此一般不同时使用联合体中的成员,设定初始值最多只能设定一个
![](https://i-blog.csdnimg.cn/blog_migrate/1687860c88e860118265023e6dffed20.png)
【2】根据大小端的不同,在内存中存储顺序有所差异,由于a与b公用一块内存空间,因此后赋值的数据会覆盖前面的数据,赋值顺序不同,数据存储有所差异
(1)先赋值b
![](https://i-blog.csdnimg.cn/blog_migrate/61edbbba35f02e4f05c49d33e25a48e5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d39604d59b087972ca585a1bb459b3ff.png)
(2)先赋值a
![](https://i-blog.csdnimg.cn/blog_migrate/e242b6b98df2d8f6d9bba4768fdce2a7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d7953ba693889746d5b2b0aa24069d69.png)
4、联合体的使用
判断大小端:
![](https://i-blog.csdnimg.cn/blog_migrate/9194ce98ebca1b3c8056d90d1d2d2e87.png)
代码表示:
union S
{
char a;
int b;
}un;
int main()
{
un.b = 1;
//00 00 00 01->大端存储
//01 00 00 00->小端存储
if (un.a == 1)
printf("为小端\n");
else
printf("为大端\n");
return 0;
}
//用函数实现
int check()
{
union S
{
char a;
int b=1;
}un;//局部变量只能在函数内部使用
return un.a;
}
int main()
{
int ret = check();
if (ret == 1)//un.a获取第一个字节的内容
printf("为小端\n");
else
printf("为大端\n");
return 0;
}