学习笔记——共用体和结构体的区别以及共用体的覆盖问题

共用体

在 C 语言中,允许几种不同类型的变量存放到同一段内存单元中,这种几个不同的变量共同占用一段内存的结构,被称为共用体类型结构,简称共用体。一般定义 形式为:
union 共用体名
{
数据类型 成员名 1;
数据类型 成员名 2;

};
只有先定义了共用体变量,才能在后续的程序中引用它。

不同于结构体的是,共用体变量的内存空间是连续的一大块,这几个变量共用这一块空间,所以要注意值被覆盖的问题。而结构体是在这连续的一大块空间中,给每个变量又划清了界限,各自拥有自己的空间,但是他们的起始地址都是连着的。不画图了用个表格看看

结构体

int 都是分开的
char
float
double

共用体

int 、char、long 、double都在这
#include <stdio.h>

//结构体
struct TsetT{
	int idata;
	char cdata;
	double ddata;
};
//联合体
union TsetU{
	int idata;
	char cdata;
	int idata1;
	double ddata;
};

int main(){
	struct TsetT t1;
	union TsetU u1;
	//二者区别在于,结构体是在一片连续的内存空间分别存放int、char、double
	//而联合体是在一块内存空间共享这些变量
	printf("t1的内存大小是%d\n",sizeof(t1));//16
	printf("u1的内存大小是%d\n",sizeof(u1));//8
	//结果显而易见,联合体是记录最大的内存(double是8),而结构体是全部累加(整数倍)
	
	
	//打印地址看看
	printf("t1.idata:%p\n",&t1.idata);
	printf("t1.cdata:%p\n",&t1.cdata);
	printf("t1.ddata:%p\n",&t1.ddata);
	
	puts("=========================");
	
	printf("u1.idata:%p\n",&u1.idata);
	printf("u1.cdata:%p\n",&u1.cdata);
	printf("u1.ddata:%p\n",&u1.ddata);
	/* 
	t1.idata:000000000061FE10
	t1.cdata:000000000061FE14
	t1.ddata:000000000061FE18
	=========================
	u1.idata:000000000061FE00
	u1.cdata:000000000061FE00
	u1.ddata:000000000061FE00 
	*/
	
	t1.idata = 10;
	t1.cdata = 'a';
	t1.ddata = 9.9;
	//打印地址看看
	printf("t1.idata:%d\n",t1.idata);
	printf("t1.cdata:%d\n",t1.cdata);
	printf("t1.ddata:%.3lf\n",t1.ddata);
	
	puts("=========================");
	// u1.ddata = 9.9;
	u1.idata = 10;
	u1.cdata = 'a';
	u1.idata1 = 50;
	u1.ddata = 9.9;
	printf("u1.idata:%d\n",u1.idata);

	
	return 0;
}

共用体覆盖的问题在同类型中就是谁最后输入就是谁显示。比如int 一个30,int 一个50,最后打印结果肯定是显示50,因为都是int类型且50是最后输入。如果不是同种类型,比如int 和float,这个有点懵,先占个坑,评论有大神给解答下,不同类型可以参考下这里。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石子君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值