联合体union<称为共用体亦可>是C语言的一种特殊的结构类型。与结构体struct很相似,除了共同内存、名称不一样,其它使用基本上都一样,包括指针等。
注意点:
- union它的成员是共用同一块内存(若对一个成员赋值,其它成员会被覆盖掉)
- union它占用的字节数,是union成员级别最高的类型占用的字节数
- union类似于其它语言的变体(如既可赋值int类型、赋值float类型、字符串类型等)
union 联合体名称{
成员列表
};
共用同一块内存:
union{
char c;
short s;
long long l;
} u1;
int main(){
u1.c = 100;
printf("%cn", u1.c); //输出100
u1.s = 0; //对成员s赋值为0
printf("%cn", u1.c); //成员c和l都被覆盖,竟然也都是0了。因此是共用一块内存
return 0;
}
#include//结构 struct st{ //st共占用1+1+2+4+8=16字体(为什么?因为 内存对齐) char c; //1个字节,留了1个字节 short s; //2个字节,留了4个字节 long long l; //8个字节 }; //联合,un占用字节数就是成员l占用的字节数 union un{ char c; short s; long long l; }; int main(){ //结构struct struct st s; printf("s.c:%uts.s:%uts.l:%un", &s.c, &s.s, &s.l); //s.c:6422032 s.s:6422034 s.l:6422040 printf("s use %zu Byten", sizeof(s)); union un u; //定义联合变量u printf("u.c:%utu.s:%utu.l:%un", &u.c, &u.s, &u.l); //u.c:6422024 u.s:6422024 u.l:6422024 printf("u use %zu Byten", sizeof(u)); u.c = 'h'; printf("u.c:%cn", u.c); u.s = 0; //对成员s操作后,只能保证成员s是正确的结果,其它成员可能不正确。因为是共用体,一次只有一个成员有效 printf("u.c:%dn", u.c); printf("u.s:%hdn", u.s); u.l = 5000; printf("u.l:%lldn", u.l); return 0; //联合指针访问 union un *pu = &u; //联合指针,指向联合变量u (*pu).l = 500; printf("u.l:%lldn", u.l); pu->s = 100; printf("u.l:%lldn", u.l); return 0; }



