目录
1、联合类型的定义
2、联合的特点
3、联合大小的计算
1、联合类型的定义
- 联合也是一种特殊的自定义类型
- 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间《所以联合也叫共用体)
先看下面代码输出什么?
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%p\n",&u);
printf("%p\n",&(u.c));
printf("%p\n",&(u.i));
return 0;
}
2、联合的特点
上面代码输出的地址是一样的,为什么呢?
因为:
- 联合的成员是某用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
举例:
- 判断当前计算机的大小端存储
- 大端存储就是高字节序放在低地址。
- 小端存储就是高字节序放在高地址。
以前的代码
int main()
{
int a = 1;
if(*(char*)&a == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}
把判断大小端写成一个函数
int check_sys()
{
int a = 1;
if((*(char*)&a) == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}
下面我们用联合类型写上面这个函数
通过联合体我们得出自己的电脑存储方式:
int check_sys()
{
union U
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端存储\n");
}
else
{
printf("大端存储\n");
}
return 0;
}
我们再和结构体做一下比较
#include<stdio.h>
//结构体
struct u //u表示结构体类型名
{
char a; //a表示结构体成员名
int b;
short c;
}U1;
//U1表示结构体变量名
//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符
//联合体
union u1 //u1表示联合体类型名
{
char a; //a表示联合体成员名
int b;
short c;
}U2;
//U2表示联合体变量名
//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符
int main(){
printf("%d\n",sizeof(U1));
printf("%d\n",sizeof(U2));
return 0;
}
//程序运行结果是:
//12
//4
总结:
- 结构体各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
- 联合体各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。
3、联合大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
举例:看下面代码输出什么
union Un
{
char a[5];
int i;
};
int main()
{
union Un u;
printf("%d\n",sizeof(u));
return 0;
}
- 各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。