一、联合的定义
联合也是一种特殊的自定义类型
这种类型定义也包含一系列的成员,特征是这些成员公用同一块空间。
//联合类型的声明 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 = 0x112233; un.c = 0x66; printf("%x\n", un.i);
运行结果:
这也更加验证了我们之前的结论,并且可以看出来是小端存储的。
三、联合大小的计算
联合大小计算的规则:
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
例如:
union Un1 { char c[5];//5 1VS8 1 int i;// 4VS8 4 }; union Un2 { short c[7];//14 2VS8 2 int i; //4VS8 4 }; int main() { printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2)); }
运行结果:
四、联合的应用
上面提到了大小端存储的问题,我们可以巧妙的利用联合来判断大小端存储。
我们可以利用1在大小端的存储方式进行判断。
union Un { int i; char c; }; int main() { //利用联合判断大小端存储 union Un u1; u1.i = 1; if (u1.c == 1) { printf("小端存储!"); } else { printf("大端存储!"); } }
运行结果: