什么是联合体
联合(union)是一种数据类型,它能在同一个内存空间中存储不同的数据类型(不是同时存储)其典型的用法是,设计一种表以存储既无规律、事先也不知道顺序的混合类型。使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。。联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
联合体的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
union Un
{
int i;
char c;
};
union Un un;
int main()
{
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
system("pause");
return 0;
}
由此可见,i 和 c都在共用一块空间。
所以对于联合体来说同一时间只能使用一个,如果两个一起使用的话,他们共用同一块空间,改变一个,另外一个也会跟着改变,内存会被覆盖掉了。
- 面试题:
- 判断当前计算机的大小端存储
un联合体 占四个字节(下面会讲到如何计算),如果是 把i 赋成1 按照小端存放就是 01 00 00 00,在判断 u.c 是否等于1(char类型只读取一个字节数据,) 如果等于1 就是小端,反之就是大端存储
#include<stdio.h>
union Un
{
int i;
char c;
};
union Un un;
int main()
{
un.i = 1;
if (un.c == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}
那联合体大小该如何计算呢?
联合大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
- 联合也是需要内存对齐的
- 请看下面的例子:
#include<stdio.h>
#include<stdlib.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面输出的结果是什么?
int main
{
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
- printf(“%d\n”, sizeof(union Un1));
答案是-> 8
因为要对齐最大对齐数整数倍,中间浪费了几个空间
- printf(“%d\n”, sizeof(union Un2));
答案是-> 16