C语言知识总结——共用体

union 共用体(联合体)

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中 以关键字union声明的一种数据结构,这种被称作“共用体”类型结构,也叫联合体。

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构体变量的总长度大于等于各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。注意这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用,共用体变量的地址和它的各成员的地址都是同一地址

  • 一个联合类型必须经过定义之后,才能把变量说明为该联合类型:

联合的定义:
定义一个联合类型的一般形式为:
union [name](联合名)   name是可选的
{
成员表
};
成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名
成员名的命名应符合标识符的规定。union Data
{int i;double f;char  str[20];
} data;现在 Data所有的成员共享一个空间,同一时间只有一个成员是的值有效的,Data 类型的变量可以存储一个整数、
一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。
您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,
Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。

注意:1、不能把共用体变量作为函数参数,也不能是函数带回共用体变量,但可以使专用指向共用体变量的指针

2、所有成员占用同一段内存,修改一制个成员会影响其余所有成员。

  • 共用体的访问:共用体访问成员的值时一般使用.运算符,指针时用->运算符(和结构体是一样的)

typedef union _node {int a;double b;char c;union _node *p;}NODE;int main(void) {NODE a;//定义变量NODE t;a.b;//用.访问t.p->a;//指针用->访问}
联合的使用规则几乎和结构体strtct的规则用法一样,只不过是内部表示的不同。补充:
还有一个是无名联合体,它是和无名结构体的工作原理是相同的
#include//简单的例子
#includetypedef union _node{int a;double b;char c[20];}NODE;int main(void) {NODE a;//这里只定义一个变量a.a = 666;printf("%d\n", a.a);a.b = 9.99;printf("%f\n", a.b);strcpy(a.c, "hello world!");printf("%s\n", a.c);//我们看到,三个都被完整的输出了,因为在同一时刻,只有一个成员是有效的}输出:
666
9.990000
hellow world!
  • 共用体的作用:

    1、节省内存,有两个很长的数据结构,不会同时使用,比如一个表示老师,一个表示学生,如果要统计教师和学生的情况用结构体的话就有点浪费了!用结构体的话,只占用最长的那个数据结构所占用的空间,就足够了!

    2、实现不同类型数据之间的类型转换,遇到各种类型的数据共用存储空间,很方便的实现了不同数据类型之间的转换,不需要显示的强制类型转换。

    其他:1、确定CPU的模式:大端、小端模式确定

    大小端不同,则存储的方式也存在差别,比如int需要4个字节,而char只需要1个字节,根据1个字节所在的具体位置即可判定CPU的模式

    2、寄存器的定义,实现整体的访问和单项的访问

//共用体综合例子:根据输入的数据类型输出需要的相应的数据
#include
#include//数据类型输出   5*4  m n     n的第几个x union node {int a;double b;char c[30];}add[10000];char p[10000][30]; //保存的字符串数组int main(void) {int n, m;scanf("%d %d", &n, &m);int x;double y;char t[50];int i, j;for (i = 0; i < n; i  ) {//输入scanf("%s", &p[i]);//作为字符串数组,需要取地址if (strcmp("INT", p[i]) == 0) {//整形scanf("%d", &x);add[i].a = x;}else if(strcmp("DOUBLE",p[i])==0){//浮点scanf("%lf", &y);add[i].b = y;}else if (strcmp("STRCING", p[i]) == 0) {//字符串scanf("%s", t);strcpy(add[i].c, t);}}for (i = 0; i < m; i  ) {//输出scanf("%d", &j);if (strcmp("INT", p[j]) == 0) {printf("%d\n", add[j].a);}else if (strcmp("DOUBLE", p[j]) == 0){printf("%f\n", add[j].b);}else if(strcmp("STRING",p[j])==0){printf("%s\n", add[j].c);}}return 0;}//输入:
/*
5 4
INT 456
DOUBLE 123.56
DOUBLE 0.476
STRING welcomeToC
STRING LemonTree
0
1
2
4
*///输出:
/*
456
123.56
0.48
LemonTree
*/

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

f387a012ee2dc96d96996b6a4d6e8fb9.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jboss入门_JBoss Forge NetBeans集成–入门

jboss入门JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此&#xff0c;它已经具有了令人敬畏的功能&#xff0c;使您作为开发人员的生活更加轻松。 在大多数情况下&#xff0c;使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多方法可以开始使用Forge基础知识…

这几道 C/C 题涉及你的知识盲区?

8个C语言面试题&#xff0c;涉及指针、运算、函数、内存&#xff0c;看看你能做出几个&#xff01;1.gets()函数问&#xff1a;请找出下面代码里的问题&#xff1a;#include int main(void) {char buff[10];memset(buff, 0, sizeof(buff));gets(buff); //gets不检查输入的字符…

logback redis_使用Spring Boot和Logback登录到Redis

logback redis在进行集中式日志记录时&#xff0c;例如使用Elasticsearch&#xff0c;Logstash和Kibana或Graylog2&#xff0c;您可以为Java应用程序提供多个选项。 您既可以编写标准的应用程序日志&#xff0c;也可以使用Logstash解析这些日志&#xff0c;这些日志既可以直接使…

C 与 C 的真正区别在哪里?

C 与 C 的真正区别在哪里&#xff1f;C是中餐厨师的菜刀&#xff0c;做啥菜就那一把刀&#xff0c;切菜切肉切鱼&#xff0c;都是这一把刀&#xff0c;刀工好的师傅&#xff0c;豆腐都能切成一朵花。无论你提什么概念&#xff0c;都能用指针给你做出来&#xff0c;如果不行&…

html 怎么置顶表格,表格(Table)表头固定,内容上滚【5个实例】

当表格往上滚动的时候&#xff0c;表头固定不动&#xff0c;这样可以让用户时刻看清每一列的数据含义&#xff0c;这是人性化的设计&#xff0c;充分考虑了用户使用体验。本文将通过5个实例&#xff0c;来介绍这种表格设计。用户可通过下载源码&#xff0c;直接应用于自己的项目…

C语言变量的定义包括变量存储类型和变量的什么?

C语言变量的定义包括变量存储类型和变量的名称。C语言定义变量的格式&#xff1a;“数据类型 变量名;”&#xff0c;“数据类型”表示想要存储什么类型的数据&#xff0c;“变量名”就是你想给这个变量起个什么名字&#xff0c;通常都是用字母。变量的定义定义变量的格式非常简…

C语言代码注释必须用/**/ , 你没看错~

事情是这样的&#xff0c;有人离职&#xff0c;公司调我补缺。那个系统一直有个工程师在维护&#xff0c;参与该系统的新人来了又走&#xff0c;他始终泰然自若。刚过去一个礼拜&#xff0c;我就心下窃吼&#xff1a;“坑爹啊!”&#xff0c;也彻底体会到什么叫---绝对的权威、…

html文档的基本类型,HTML(网页的文档类型介绍)

一个html文件的第一行代码通常就是用于声明网页文档类型&#xff0c;其格式是:这一行不是属于标签文档类型:可以理解为不同的html版本&#xff01;html4.0 或4.01版本基本固定&#xff0c;但又有分化:严格性:了用的标签和属性相对较少&#xff0c;但能兼容更多的浏览器。宽松型…

C语言源代码展示:常用转换函数实现原理

编程时经常用到进制转换、字符转换。比如软件界面输入的数字字符串&#xff0c;如何将字符串处理成数字呢&#xff1f;和大家分享一下。01字符串转十六进制代码实现&#xff1a;void StrToHex(char *pbDest, char *pbSrc, int nLen) {char h1,h2;char s1,s2;int i;for (i0; i …

html5 移动 优化,第四天:HTML5移动站优化技巧 摘自《10天学会移动站SEO》

现在大家基本上做手机网站都是做成HTML5的&#xff0c;因为现在智能手机等移动设备越来越多&#xff0c;几乎全部支持HTML5&#xff0c;那么给网站适配上HTML5的网站就很是必要了。以前的WML网站已经淘汰&#xff0c;而最新的方式就这种最好。我们这一节就重点讲一讲HTML5移动网…

c语言中switch的用法是什么?

c语言中switch的用法是&#xff1a;功能&#xff1a;switch语句是多分支选择语句.用来实现多分支选择结构.if语句只有两个分支可供选择,而实际问题中常常要用到多分支的选择.例如,学生成绩分类(90为"A"等,80-89分为B等,70-90分为C等......).当然这些都可以用嵌套的if…

C语言“fread”函数的用法?

C语言“fread”函数的用法为“size_tf read(void *buffer,size_t size,size_t count,FILE *stream)”&#xff0c;其作用是从一个文件流中读数据&#xff0c;读取count个元素&#xff0c;每个元素size字节。示例1#include #include #include int main(){ FILE *stream; c…

html怎么设置数据条的颜色,jQuery EasyUI 数据网格 – 条件设置行背景颜色 | 菜鸟教程...

jQuery EasyUI 数据网格 - 条件设置行背景颜色本教程将向您展示如何根据一些条件改变数据网格(datagrid)组件的行样式。当 listprice 值大于 50 时&#xff0c;我们将为该行设置不同的颜色。数据网格(datagrid)的 rowStyler 函数的设计目的是允许您自定义行样式。以下代码展示如…

C语言中for语句的执行过程是什么?

C语言中for语句的执行过程是&#xff1a;for语句的一般形式为&#xff1a;for&#xff08;单次表达式;条件表达式;末尾循环体&#xff09;{中间循环体&#xff1b;}。for循环执行时&#xff0c;会先判断条件表达式是否成立&#xff0c;如果条件成立则执行中间循环体&#xff0c…

c语言getch()的用法是什么?

C语言中getch()函数功 能&#xff1a; 从stdio流中读字符&#xff0c;即从控制台读取一个字符&#xff0c;但不显示在屏幕上用 法:int getchar(void);这个函数是一个不回显函数&#xff0c;当用户按下某个字符时&#xff0c;函数自动读取&#xff0c;无需按回车&#xff0c;有的…

淮安中专学计算机哪个学校好,2021淮安初中十强排名 哪些初中比较好

对于淮安的学生来说&#xff0c;了解淮安初中排名会更有利于选择初中。那么&#xff0c;2021淮安初中十强有哪些学校呢?下面小编整理了一些相关信息&#xff0c;供大家参考!2021淮安十大初中排名1、淮安兴隆中学2、淮安郑梁梅中学华禹分校3、淮安高堰九年制学校4、淮安长江路中…

C 隐式类型转换是什么?

C 隐式类类型转换《C Primer》中提到&#xff1a;“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是&#xff0c; “可以用单个形参进行调用” 并不是指构造函数只能有一个形参&#xff0c;而是它可以有多个形参&#xff0…

文科女生单招学计算机,文科女生走单招学什么专业好

对于文科女生来说&#xff0c;想要走高职单招选择什么专业好呢?有哪些专业适合文科女生来学习呢?有途网小编为大家整理了一些专业。语言类专业对于高职单招的专业来说&#xff0c;如今的社会发展对于纯中文的专业并不看好&#xff0c;所以说如果文科女生想要学习语言类高职单…

工程师必备:C/C 单元测试万能插桩工具

研发效能是一个涉及面很广的话题&#xff0c;它涵盖了软件交付的整个生命周期&#xff0c;涉及产品、架构、开发、测试、运维&#xff0c;每个环节都可能影响顺畅、高质量地持续有效交付。在腾讯安全平台部实际研发与测试工作中我们发现&#xff0c;代码插桩隔离是单元测试工作…

这才是你想要的C语言学习路线!

点击上方蓝字关注我&#xff0c;了解更多咨询作为一门古老的编程语言&#xff0c;大家熟知它不仅是因为拥有48年的发展历程&#xff0c;更主要还是因为当下大部分程序员走入编程世界第一个学习的语言就是C语言。而近年来高速发展的物联网和智能设备&#xff0c;又把C语言推向了…