Pixiv:疯猫MC
结构体如同一个团体,团体内有很多成员。而共用体如同人格分裂,本身就是一个而存在多个不同的人格。
虽然在对成员处理上不太一样,但用法基本和结构体一致,共用体指针也是使用->来获取成员变量。
union 共用体名称{
成员1;
成员2;
成员3;
//...
};
#include<stdio.h>
union _test{
int a;
double b;
char *str;
};
int main(void){
union _test test;
test.a = 200;
printf("%d\n",test.a);
test.b = 1.2345;
test.str = "13245";
printf("a的地址%p\n",&test.a);
printf("b的地址%p\n",&test.b);
printf("str的地址%p\n",&test.str);
}
//从结果来看,共用体内的成员变量确实是使用同一地址
共用体的成员无法一起打印出,因为都共用同一内存会相互覆盖
#include<stdio.h>
union _test{
int a;
double b;
char *str;
};
int main(void){
union _test test;
test.a = 200;
printf("%d\n",test.a);
test.b = 1.2345;
//此时覆盖a,a无法正常输出
test.str = "13245";
//此时覆盖b,b无法正常输出
printf("a为%d\n",test.a);
printf("b为%lf\n",test.b);
printf("str为%s\n",test.str);
}
共用体占用的内存会大于等于所有成员中占用最多内存空间的成员。
由于【内存对齐】的关系可能会有一部分多余的内存。
共用体也可以嵌套结构体,当然共用体目前来说用到的场景比较少,可以先不考虑。
union _data{
int a;
char b;
float c;
};
union _data t1 = {
520,
‘c‘,
};
//按顺序来初始化共用体
//在C99下有这种初始化方法
union _data t2 = {
.b = ‘b‘,
.c = 1.2
};
//指定成员去初始化
原文:https://www.cnblogs.com/AlienfronNova/p/14623055.html