目录
1、联合类型的定义
2、联合的特点
3、联合大小的计算
- 联合也是一种特殊的自定义类型
- 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间《所以联合也叫共用体)
先看下面代码输出什么?
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;
}
上面代码输出的地址是一样的,为什么呢?
因为:
- 联合的成员是某用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
举例:
- 判断当前计算机的大小端存储
- 大端存储就是高字节序放在低地址。
- 小端存储就是高字节序放在高地址。
以前的代码
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
//结构体
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变量的总长度等于所有成员的长度之和。
- 联合体各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
举例:看下面代码输出什么
union Un
{char a[5];int i;
};
int main()
{union Un u;printf("%d\n",sizeof(u));return 0;
}
- 各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。