[西门子] C语言中的内存覆盖技术:共同体的实际应用教程案例

[复制链接]
查看287 | 回复0 | 2024-6-28 08:05:29 | 显示全部楼层 |阅读模式
>点击蓝字,关注我们






C语言中的内存覆盖技术:共同体的概念和操作

链表是C语言的魅力:5个你必须知道的链表的类型,格式,用法(二)

01
本节重点
C语言共同体的应用
上节课讲解了关于C语言的一些基础知识,本节就来说说,这个共同体该如何使用,主要以一个例子来进行说明。






共同体的应用


共同体在一般的编程中应用较少,在单片机中应用较多。对于PC机,经常使用到的一个实例是:现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。


请看下面的表格:
| 姓名 | 编号 | 性别 | 职业 |分数/课程 |
| :--: | :--: | :--: |:--: | :-------: |
| 张三 | 101  | 男   |教师 |  数学 |
| 李四 |102 | 女  | 学生 |   90    |
| 王五 | 103  | 男   |教师 |  物理 |
| 赵六 |104 | 男  | 学生 |   98    |




可以看出,学生和教师所包含的数据是不同的。现在要求把这些信息放在同一个表格中,并设计程序输入人员信息然后输出。如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前四个成员变量是一样的,第五个成员变量可能是分数或者课程。当第四个成员变量的值是s的时候,第五个成员变量就是分数;当第四个成员变量的值是t的时候,第五个成员变量就是课程。


编写程序


经过上面的分析,我们可以设计一个包含共同体的结构体,请看下面的代码:


































































#include <stdio.h>#include <string.h>
#define TOTAL 4 //人员总数struct {    char name[20]; //姓名    int num; //编号    char sex[20]; //性别    char profession; //职业    union   {        float score; //分数        char course[20]; //课程    } sc; //共同体} bodys[TOTAL]; //结构体数组
int main() {    int i;    char ch; //用来清除缓冲区的字符    //输入人员信息    for (i = 0; i < TOTAL; i++)   {        printf("请输入第%d个人的信息:\n", i + 1);        printf("姓名:");        scanf("%s", bodys.name);        printf("编号:");        scanf("%d", &bodys.num);        printf("性别:");        scanf(" %s", &bodys.sex); //加一个空格        printf("职业:");        while ((ch = getchar()) != '\n'); //清除缓冲区中的所有字符,直到遇到换行符        bodys.profession = getchar(); //使用getchar()函数        if (bodys.profession == 's')     { //如果是学生            printf("分数:");            scanf("%f", &bodys.sc.score);        }     else     { //如果是教师            printf("课程:");            scanf("%s", bodys.sc.course);        }        fflush(stdin); //清空输入缓冲区    }    //输出人员信息    printf("\n姓名\t编号\t性别\t职业\t分数/课程\n");    for (i = 0; i < TOTAL; i++)   {        printf("%s\t%d\t%s\t%c\t", bodys.name, bodys.num, bodys.sex, bodys.profession); //修改%s为%c        if (bodys.profession == 's')     { //如果是学生            printf("%f\n", bodys.sc.score);        }     else     { //如果是教师            printf("%s\n", bodys.sc.course);        }    }    return 0;}


运行结果:


姓名                编号        性别        职业        分数/课程
请输入第1个人的信息:
姓名:张三
编号:101
性别:男
职业:t
课程:数学
请输入第2个人的信息:
姓名:李四
编号:102
性别:女
职业:s
分数:90
请输入第3个人的信息:
姓名:王五
编号:103
性别:男
职业:t
课程:物理
请输入第4个人的信息:
姓名:赵六
编号:104
性别:男
职业:s
分数:98



这段代码使用了一个包含共同体的结构体数组,根据不同的职业,输入和输出不同的数据。这样就避免了为每个人分配多余的内存空间,提高了内存的利用率。







想要学习C语言的朋友可以自己购买下面推荐的c语言基础从入门到精通,内容包含c语言初始到最终实战,附赠视频教学,让你轻松学习C语言。




点赞加关注,学习不迷路
微信公众号|工控小新
EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中




发现“分享”“赞”了吗,戳我看看吧




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则