共用体(联合体)

共用体就是联合体

共用体就是不同的成员在同一片内存空间中,穿同一条裤子

结构体和共用体差别在于,结构体成员有各自的空间,是独立的。共用体是占用同一个空间。

共用体的定义方式和结构体差不多使用关键字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);//20

printf("%d",e.out.p);//0

printf("%d",e.c);//10
printf("%d", e.d);//10

e.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);//20

e.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]);//20

    printf("%d",e.b[1]);//20
}

这个就可以看出来,a[1]的值是不变的。

总结 :struct中变得是第一个成员变量,其余都是不变。

数组也是变得是a[0],a[1]的值和struct第二个成员变量值一样或和初值一样。

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值