联合体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("%c\n", u1.c); //输出100
u1.s = 0; //对成员s赋值为0
printf("%c\n", u1.c); //成员c和l都被覆盖,竟然也都是0了。因此是共用一块内存
return 0;
}
#include <stdio.h>
/*
时间:2022-05-12 15:16
作者:sgbl888
功能:联合union
知识点:
1、联合的成员是共用内存,一次只有一个成员有效。也就是说对哪个成员操作,那个成员才是有效。其它成员是无效的结果
2、
3、
*/
//结构
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:%u\ts.s:%u\ts.l:%u\n", &s.c, &s.s, &s.l); //s.c:6422032 s.s:6422034 s.l:6422040
printf("s use %zu Byte\n", sizeof(s));
union un u; //定义联合变量u
printf("u.c:%u\tu.s:%u\tu.l:%u\n", &u.c, &u.s, &u.l); //u.c:6422024 u.s:6422024 u.l:6422024
printf("u use %zu Byte\n", sizeof(u));
u.c = 'h';
printf("u.c:%c\n", u.c);
u.s = 0; //对成员s操作后,只能保证成员s是正确的结果,其它成员可能不正确。因为是共用体,一次只有一个成员有效
printf("u.c:%d\n", u.c);
printf("u.s:%hd\n", u.s);
u.l = 5000;
printf("u.l:%lld\n", u.l);
return 0;
//联合指针访问
union un *pu = &u; //联合指针,指向联合变量u
(*pu).l = 500;
printf("u.l:%lld\n", u.l);
pu->s = 100;
printf("u.l:%lld\n", u.l);
return 0;
}