c语言中,联合是一种特殊的自定义类型,这些类型定义的变量也包含一系列的成员,但在联合中,这些成员共同用一块空间。所以联合,也叫做共同体。
联合的所有成员共用一块内存空间,因此一个联合变量的大小最小是其最大成员的大小(考虑到内存对齐等因素,实际大小可能会稍大一些)。在同一时间,联合中只能存储一个成员的值,当给联合中的一个成员赋值后,其他成员的值将变得不可预测。
(内存对齐: 当联合中最大成员的大小不是默认对齐数的整数倍,就要对齐到默认对齐数的整数倍上)
结构体三个成员位于相同的地址;
一.定义
union 联合名称
{
数据类型1 成员1;
数据类型2 成员2;
// ... 其他成员
};
声明:
union 联合名称 变量名;
也可以在定义联合的同时声明变量:
union {
数据类型1 成员1;
数据类型2 成员2;
// ... 其他成员
} 变量名;
二.使用
与访问结构体相同,联合也通过' . ' 来访问;
//通过联合判断机器是大端还是小端
char check()
{
union un//共用同一块空间
{
char c;
int i;
}un;
un.i = 1;//整型
return un.c;//因为联合共用一块空间,所以i储存值的位置与c相同
//而c是char类型,一次只能对1字节进行操作,所以如果c == 1那么就证明机器是以小端的方式进行储存的
}
int main()
{
int a = 1;
if (check() == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
在使用联合时,当联合不同成员的长度相差悬殊,存储长度较短的成员时,会浪费一部分空间。在这种情况下,可以在联合中存储指向不同成员的指针而不是直接存储成员本身。所有指针的长度都是相同的,这样就避免了内存浪费的问题。