目录
一、联合的定义
联合也是一种特殊的自定义类型
这种类型定义也包含一系列的成员,特征是这些成员公用同一块空间。
-
//联合类型的声明
-
union
Un
-
{
-
char c;
-
int i;
-
};
-
int main()
-
{
-
union
Un un;
//联合类型的定义
-
printf(
"%d",
sizeof(un));
//计算联合类型变量的大小
-
return
0;
-
}
运行结果: 4
二、联合的特点
联合的成员是公用一块内存空间的,那么一个联合变量的大小,至少是最大成员的大小。
那么,联合的成员的地址是一样的吗?
-
int main()
-
{
-
union Un un;
//联合类型的定义
-
//
printf(
"%d", sizeof(un));
//计算联合类型变量的大小
-
printf(
"%d\n", &(un.i));
-
printf(
"%d\n", &(un.c));
-
return
0;
-
}
运行结果:
再进一步验证:
-
un.i
=
0x
112233;
-
un.c
=
0x
66;
-
printf(
"%x\n", un.i);
运行结果:
这也更加验证了我们之前的结论,并且可以看出来是小端存储的。
三、联合大小的计算
联合大小计算的规则:
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
例如:
-
union Un
1
-
{
-
char c[
5];
/
/
5
1VS
8
1
-
int i;
/
/
4VS
8
4
-
};
-
union Un
2
-
{
-
short c[
7];
/
/
14
2VS
8
2
-
int i;
/
/
4VS
8
4
-
};
-
int main()
-
{
-
printf(
"%d\n", sizeof(union Un
1));
-
printf(
"%d\n", sizeof(union Un
2));
-
}
运行结果:
四、联合的应用
上面提到了大小端存储的问题,我们可以巧妙的利用联合来判断大小端存储。
我们可以利用1在大小端的存储方式进行判断。
-
union Un
-
{
-
int i;
-
char c;
-
};
-
int main()
-
{
-
/
/利用联合判断大小端存储
-
union Un u
1;
-
u
1.i
=
1;
-
if (u
1.c
=
=
1)
-
{
-
printf(
"小端存储!");
-
}
-
else
-
{
-
printf(
"大端存储!");
-
}
-
}
运行结果: