C语言,共用体

看一个实际需求

现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓 名、编号、性别、职业、教学科目。请看下面的表格:
在这里插入图片描述
传统的方式来解决 定义结构体,根据人员的职业,使用对应的成员变量。

struct Person{ 
	char name[20]; 
	int num; 
	char sex; 
	char profession; 
	float score; // 学生使用 score 
	char course[20]; // 老师使用 course 
} ; 

传统方式的问题分析 : 会造成 空间的浪费 , 比如学生只使用 score ,但是 也占用了 course 成员的 20 个字节

解决方案
1)做 struct Stu 和 struct Teacher [但如果职业很多,就会对应多个结构体类型, 不利于管理]
2)使用共用体

基本介绍

1)共用体(Union)属于 构造类型,它可以包含多个类型不同的成员。和结构体非常类似, 但是也有不同的地方. 共用体有时也被称为联合或者联合体, 定义格式为

union 共用体名{ 
	成员列表 
}; 

2)结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员 占用同一段内存,修改一个成员会影响其余所有成员

快速入门

1)定义共用体的方式和结构体一样,都有三种方式

(1)
union data{
	int n;
	char ch;
	double f;
};
union data a,b,c;

(2)
union data{
	int n;
	char ch;
	double f;
}a,b,c;

(3)
union{
	int n;
	char ch;
	double f;
}a,b,c;

2)案例演示

#include <stdio.h> 

union data{ // data 就是一个共用体(内存布局), 包含三个成员, 共享数据空间, 该空间的大小以占用最大的成员为 准 
	int n; 
	char ch; 
	short m; 
}; 


void main(){ 
	union data a; //定义两个一个 共用体变量 a 
	printf("%d, %d\n", sizeof(a), sizeof(union data) ); // 4, 4 

	a.n = 0x40;//16 进制 
	printf("%d, %c, %d\n", a.n, a.ch, a.m);
	
	a.ch = '9'; 
	printf("%d, %c, %d\n", a.n, a.ch, a.m); 

	a.m = 0x2059; 
	printf("%d, %c, %d\n", a.n, a.ch, a.m); 

	a.n = 0x3E25AD54; 
	printf("%d, %c, %d\n", a.n, a.ch, a.m);
	
}

最佳实践

现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓 名、编号、性别、职业、教学科目。请看下面的表格:, 请使用共用体编程完成.

在这里插入图片描述
代码演示:

#include <stdio.h>


#define TOTAL 2 //人员总数 (老师,学生,各两个人)

//定义了一个结构体 Person

//union MYUNION {
// float score;
// char course[20];
//};

struct Person {
	char name[20]; //name
	int num; //编号
	char sex;//性别 f => 女 m=>男
	char profession;//职员 s=>学生 t=>老师
	union {
		float score;
		char course[20];
	} sc;//sc 是一个共用体变量
};


void main() {
	int i;
	struct Person persons[TOTAL]; // 定义了一个结构体数组

	//输入人员信息
	for(i=0; i<TOTAL; i++) {
		printf("Input info: ");
		//输入学生/老师信息
		scanf("%s %d %c %c", persons[i].name, &(persons[i].num), &(persons[i].sex), &(persons[i].profession));

		if(persons[i].profession == 's') {
			//如果是学生
			printf("请输入该学生成绩:");
			scanf("%f", &persons[i].sc.score);
		} else {
			//如果是老师
			printf("请输入该老师课程:");
			scanf("%s", persons[i].sc.course);
		}

		fflush(stdin);//刷新
	}
	//输出人员信息
	printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");

	//将老师和学生展示出来
	for(i=0; i<TOTAL; i++) {
		if(persons[i].profession == 's') {
			//如果是学生
			printf("%s\t\t%d\t%c\t%c\t\t%f\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.score);
		} else {
			//如果是老师
			printf("%s\t\t%d\t%c\t%c\t\t%s\n", persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.course);
		}
	}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的共用体(Union)和位域(Bit-Field)是用来优化内存使用和灵活操作数据的工具。 共用体是一种特殊的数据类型,它允许不同的变量共享同一块内存空间。共用体中的成员变量共享同一内存,占用内存大小等于最大成员的大小。通过修改共用体的一个成员变量的值,可以影响到其他成员变量的值。共用体适用于在不同的数据类型之间进行转换或者存储占用内存大小不定的数据。 位域是一种特殊的结构体成员变量,可以指定成员变量占用的位数,从而实现对内存空间的灵活利用。位域的成员变量必须是整型数据类型,并且位域的大小不能超过该整型类型的大小。位域可以用于减小数据结构占用的内存大小,以及进行数据的位操作。 共用体和位域结构体可以一起使用。通过在位域结构体中定义共用体成员变量,可以实现对内存的灵活使用和数据的高效操作。共用体可以用于存储不同类型的数据,而位域可以用于压缩数据的存储空间。这种结合使用的方式可以为我们的程序带来更加高效和节省内存的特点。 总结起来,C语言中的共用体和位域结构体提供了一种优化内存使用和操作数据的方式。它们可以灵活地对内存空间进行利用,并且能够高效地操作数据。通过合理的使用共用体和位域结构体,我们可以达到节省内存和提高程序执行效率的目的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值