共用体就是联合体
共用体就是不同的成员在同一片内存空间中,穿同一条裤子
结构体和共用体差别在于,结构体成员有各自的空间,是独立的。共用体是占用同一个空间。
共用体的定义方式和结构体差不多使用关键字union
#include<stdio.h>
union stu {
int a;
short b;
char c;
};
int main()
{
union stu un = {12};//初始化只能写一个数据,因为都共用一个内存空间
}
union stu un = {12,24};//会报错,只能初始化一个
#include<stdio.h>
union stu {
int a;
short b;
char c;
};
int main()
{
union stu un = {12};
printf("%d %d %d\n",un.a,un.b,un.c);//12 12 12
un.a = 50;
// 因为共同占用一个内存单元,所以修改一个值,其他的值叶变换
printf("%d %d %d\n", un.a, un.b, un.c); //50 50 50
un.b = 90;
printf("%d %d %d\n", un.a, un.b, un.c);//90 90 90
un.a = 66666;
printf("%d %d %d\n", un.a, un.b, un.c);//66666 1130 106
}
为什么会是1130 106 呢?
a是int 类型,范围很大,所以能装下
b是short类型,范围是-32768~~32767,66666超出范围,c也是同理
共用体+结构体类似题目
#include<stdio.h>
union exp
{
struct
{
int a;
int b;int p;
}out;
int c;
int d;
}e;int main()
{e.out.a = 10;
e.out.b = 20;printf("%d", e.out.a);//10
printf("%d", e.out.b);//20printf("%d",e.out.p);//0
printf("%d",e.c);//10
printf("%d", e.d);//10e.c = 10;
e.d = 11;
printf("%d",e.c);//11
printf("%d",e.d);//11
printf("%d",e.out.a);//11
printf("%d",e.out.b);//20e.out.p = 90;
printf("%d",e.out.p);//90
printf("%d", e.c); //11
}
e.c e.d 是11不奇怪,而struct类型a也是11,而b却不是 一直保持20,p也是不受影响,struct就第一个成员变量受到影响。
#include<stdio.h>
union exp
{
int a[2];
struct {
int b;
int c;
}in;
int d;
}e;
int main()
{
e.in.b = 10;
e.in.c = 11;
e.d = 3;
printf("%d",e.in.b);//3
printf("%d",e.in.c);//11
printf("%d", e.a[0]);//3
printf("%d",e.a[1]);//11
}
还是老样子,这次多了数组,struct是成员变量第二个不变,而数组也是。
#include<stdio.h>
union exp
{
int a[2];
int b[2];
int c;}e;
int main()
{
e.a[0] = 10;
e.b[1] = 20;
e.c = 30;
printf("%d",e.a[0]);//30
printf("%d", e.b[0]);//30
printf("%d",e.a[1]);//20printf("%d",e.b[1]);//20
}
这个就可以看出来,a[1]的值是不变的。
总结 :struct中变得是第一个成员变量,其余都是不变。
数组也是变得是a[0],a[1]的值和struct第二个成员变量值一样或和初值一样。
...