共用体/联合体和小练习

文章通过示例代码详细解释了C语言中联合体(共用体)与结构体的区别。结构体的各个成员拥有独立的存储空间,而共用体的成员共享同一块内存,赋值时会覆盖之前的数据。此外,文章还展示了如何使用共用体来封装学生和老师的信息。
摘要由CSDN通过智能技术生成

共用体/联合体

联合体union:像结构体但是有区别

联合体/共用体和结构体的区别:

  1. 结构体元素有各自单独空间;共用体元素共享空间,空间大小有最大类型确定
  2. 结构体元素互不影响;共用体赋值会导致覆盖

结合代码注释理解

示例代码:
#include<stdio.h>
//联合体/共用体和结构体的区别
//1. 结构体元素有各自单独空间;共用体元素共享空间,空间大小有最大类型确定
//2. 结构体元素互不影响;共用体赋值会导致覆盖

struct TestS
{
int idata;
char cdata;
double ddata;
};

union TestU
{

int idata;
char cdata;
double ddata;

};

int main()
{
struct TestS s1;
union TestU u1;

printf("结构体s1的大小:%d\n",sizeof(s1));
printf("联合体u1的大小:%d\n",sizeof(u1));

printf("结构体idata:%p\n",&s1.idata);
printf("结构体cdata:%p\n",&s1.cdata);
printf("结构体ddata:%p\n",&s1.ddata);

printf("联合体idata:%p\n",&u1.idata);
printf("联合体cdata:%p\n",&u1.cdata);
printf("联合体ddata:%p\n",&u1.ddata);


s1.idata=10;
s1.cdata='a';
s1.ddata=20.0;

printf("s1:idata=%d\n",s1.idata);
printf("s1:cdata=%c\n",s1.cdata);
printf("s1:ddata=%lf\n",s1.ddata);


u1.idata=10;
u1.cdata='a';

printf("u1:%d\n",u1.idata);//注意:共用体后面赋的值会覆盖前面赋的值,因为共用一片空间


return 0;

}

运行结果:
在这里插入图片描述

联合体小练习:实现学生和老师信息的封装以及输出

结合代码注释理解

示例代码:

#include<stdio.h>

struct Person
{
char name[32];
int num;
char sex;
char job;//工作
union
{
int class;//学生所在班级
char subjt[14];//老师教的科目
}mes;
};
int main()
{
struct Person per[2];
int i;

for(i=0;i<2;i++)
{
	printf("请输入职业: t代表教师,s代表学生\n");
	scanf("%c",&(per[i].job));
	if(per[i].job=='t')
	{
		puts("请输入教师名字:");
		scanf("%s",per[i].name);
		
		puts("请输入教师编号: ");
		scanf("%d",&(per[i].num));
		
		getchar();//吸收回车符,防止后面的scanf录入
		puts("请输入教师性别:  b代表男,g代表女");
		scanf("%c",&(per[i].sex));
		
		puts("请输入教师所教的科目:");
		scanf("%s",per[i].mes.subjt);
		
	}else
	{
		puts("请输入学生名字:");
		scanf("%s",per[i].name);
		
		puts("请输入学生编号: ");
		scanf("%d",&(per[i].num));
		
		getchar();
		puts("请输入学生性别:  b代表男,g代表女");
		scanf("%c",&(per[i].sex));
		
		puts("请输入学生所在班级:");
		scanf("%d",&(per[i].mes.class));
	}
	getchar();//吸收回车符,防止后一轮循环的第一个scanf录入
}

for(i=0;i<2;i++)
{
	if(per[i].job=='t')
	{
		printf("教师名字:%s 编号:%d 性别:%c 所教科目:%s\n",
		per[i].name,per[i].num,per[i].sex,per[i].mes.subjt);
	}else
	{
		printf("学生名字:%s 编号:%d 性别:%c 班级:%d\n",
		per[i].name,per[i].num,per[i].sex,per[i].mes.class);
	}
}

return 0;

}

运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值