前言
前面我们已经讲过了两种数据类型:数组、结构体,那么本文章我们来讲一下联合体
联合体是什么?
在C语言中,联合体(Union)是一种特殊的数据类型,它允许不同的数据类型共享同一块内存空间。联合体的定义和使用方式类似于结构体(Struct),但它们在内存布局和用途上有显著区别
一、联合体的定义
联合体的定义与结构体的定义是十分的相似的,我们可以这样子进行定义:
c
union 数据类型名 {
数据类型1 变量名1;
数据类型2 变量名2;
...
数据类型n 变量名n;
};
如下:
c
union Un {
int a;
float i;
char arr[20];
};
这里我们定义了一个联合体,里面有着int、float char[]的数据类型,同时对于联合体来说其数据类型名是可以省略的,如:
c
union {
int a;
int i;
char arr[20];
};
但是定义了匿名的联合体,我们希望使用typedef关键字对其进行命名,避免混淆
二、联合体的特点
- 共享内存大小: 联合体的所有成员共享同一块内存空间。这意味着在任何时刻,联合体中只有一个成员的值是有效的,其他成员的值可能会被覆盖,我们看下面的代码:
c
#include <stdio.h>
union Un {
int i;
char ch;
};
int main() {
union Un n1;
n1.i = 10;
printf("%d\n", n1.i);
n1.ch = 'a';
printf("%d\n", n1.i);
return 0;
}
结果如下:
这里我们发现,我们对i赋值后打印的i是正常的,但是我们再对ch赋值后,打印出来的i却是不一样的,说明了联合体是共存内存大小的,修改了其中的一个成员参数,其它成员也可能被改变
- 内存大小: 联合体的大小至少等于其最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
![](https://i-blog.csdnimg.cn/direct/165e7c5e0c5445ecb3a6d6ffba6db5b0.png)
这里我们int类型对齐数为4,char类型对齐数为1,最大的成员大小为4Byte,所以联合体大小为4Byte
![](https://i-blog.csdnimg.cn/direct/9a3e0179ea254939b4b2782215c65d6b.png)
这里我们的int类型对齐数为4Byte,char类型对其数为1Byte,但是最大的成员的char c[5] 大小为5Byte,因为联合体大小要与最大对齐数的整数倍,所以为8Byte
End
关于联合体的知识我们就讲到这里,小编的知识有限,希望本文章对您们有所帮助!谢谢大家的浏阅读!