1.0 联合类型的定义
联合也是一种特殊的自定义类型。
这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)。
比如:
//联合类型的声明
union U
{
int a;
int c;
};
int main()
{
//联合变量的定义
union U u;
//计算联合变量的大小
printf("%d\n",sizeof(u));
//查看联合类型成员是否在同一块空间上
printf("%p\n",u);
printf("%p\n",&(u.a));
printf("%p\n",&(u.c));
return 0;
}
结论:证明了联合的大小和空间共用。
1.1 联合的特点
联合的成员是共用同一块内存空间,这样一个联合变量的大小,至少是最大成员的大小(因为联合体至少要有能力保存最大的那个成员)。
union U
{
int a;
int c;
};
int main()
{
union U u;
u.a = 0x11223344;
u.c = 0x00;
printf("%d\n", u.a);
printf("%d\n", u.c);
return 0;
}
面试题:判断当前电脑是大端存储还是小端存储?
int main()
{
int i = 1;
//0x 00 00 00 01
//低------------>高
//0x 10 00 00 00 小端
//0x 00 00 00 01 大端
char j = *((char*)&i);
if (j==0)
printf("大端");
else
printf("小端");
return 0;
}
int main()
{
union U
{
int a;
char b;
}u;
u.a=1;
//0x 00 00 00 01
//低------------>高
//0x 10 00 00 00 小端
//0x 00 00 00 01 大端
if (u.b==0)
printf("大端");
else
printf("小端");
return 0;
}
1.2 联合大小的计算
- 联合的大小至少是最大成员的大小
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
比如:
union un1
{
char arr[5]; //5
int i; //4
}u;
int main()
{
printf("%d\n",sizeof(u)); //当最大成员大小不是最大对齐数的整数倍的时候
//就要对齐到最大对齐数的整数倍,所以是8
return 0;
}