网站首页 > 技术文章 正文
结构体是一个萝卜一个坑,而共用体是多人共用一个茅坑,根据这群人中体形最大的一个人来决定这个茅坑的尺寸。
当多个数据类型共用一块内存空间时,这块内存空间就可以用不同的数据类型来定义,当用一个数据类型赋值时,如果用另一个数据类型去访问,就相当于做了强制类型转换。
如果两个实体的大部分成员信息相同,而只有小部分成员信息不同,这时,就没必要定义两个结构体,而是定义一个结构体,不同的部分用嵌入的共用体来定义,这是共用体的价值所在。
例如,学生和老师,就可以共用一个结构体,不同的信息定义在共用体中:
#include <stdio.h>
#include <stdlib.h>
struct infor{
char name[20];
char sex[10];
int age;
char identity; // s表示student、t表示teacher
union otherinf{ // 根据identity区别设置信息
struct {
char profession[10];
char department[20];
double salary;
}teacher;
struct {
char num[20];
char department[20];
char major[20];
}student;
}perinf;
};
void print(struct infor per[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("\n姓名:%s\t性别:%s\t年龄:%d\n",per[i].name,per[i].sex,per[i].age);
if('s'==per[i].identity)
{
printf("学生的学号:%s\t所属的院系:%s\t专业:%s\n",per[i].perinf.student.num,
per[i].perinf.student.department,per[i].perinf.student.major);
}
else
{
printf("教师的职称:%s\t所属的院系:%s\t月薪:%6.2f\n\n",per[i].perinf.teacher.profession,
per[i].perinf.teacher.department,per[i].perinf.teacher.salary);
}
}
return ;
}
void input(struct infor per[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请依次输入姓名,性别,年龄,身份:");
scanf("%s%s%d%s",&per[i].name,&per[i].sex,&per[i].age,&per[i].identity);
if('s'==per[i].identity)
{
printf("\n请依次输入学生的学号,所属的院系,专业:");
scanf("%s%s%s",&per[i].perinf.student.num,&per[i].perinf.student.department,
&per[i].perinf.student.major);
}
else if('t'==per[i].identity)
{
printf("\n请依次输入教师的职称,所属的院系,月薪:");
scanf("%s%s%lf",&per[i].perinf.teacher.profession,&per[i].perinf.teacher.department,
&per[i].perinf.teacher.salary);
}
else
{
printf("输入出错!\n");
exit(0);
}
}
return ;
}
void main()
{
struct infor per[2];
input(per,2);
print(per,2);
while(1);
return ;
}
/*
张丽玲 女 35 t
教授 电信学院 8900
张晓明 男 22 s
202060639 电信学院 信息与系统
*/
-End-
- 上一篇: C++中,常用的强制类型转换函数
- 下一篇:已经是最后一篇了
猜你喜欢
- 2025-08-02 C++中,常用的强制类型转换函数
- 2025-08-02 如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 2025-08-02 C++20 新特性(24):模板访问权限和typename的放宽
- 2025-08-02 C++零基础到工程实践
- 2025-05-14 “Rust真能防住C代码里的那些老问题吗?我们做了个实验验证”
- 2025-05-14 C语言连续生成不同的随机数方法实例加程序
- 2025-05-14 C++20尝鲜:新增语法糖
- 2025-05-14 C 语言的整数提升
- 2025-05-14 C语言之位运算符
- 2025-05-14 CSP-J 2024 信奥赛入门组第一轮初赛真题及答案解析(C++)
- 08-02C|在一个结构体嵌套一个共用体实现一体多用
- 08-02C++中,常用的强制类型转换函数
- 08-02如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 08-02C++20 新特性(24):模板访问权限和typename的放宽
- 08-02C++零基础到工程实践
- 08-02[深度学习] Python人脸识别库face_recognition使用教程
- 08-02AI算法之怎么利用Python实现支持向量机SVM算法
- 08-02【机器学习】SVM支持向量机
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 623℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 526℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 491℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 460℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)