-
2017-11-03 10:20:13
union在C中本质上是一个结构体,用法和struct相似,用
union 名称 { //... 成员 };
来声明
类型使用时,要在名称前加上关键字union
union 类型名称 变量名称;
在调用时用后缀表达式expression.identifier的形式来调用成员:
a.member1 = 10; // a为union p->member1 = 20; // p为union的指针
但有一些不同点:
1.union,顾名思义,就是多个成员共用一块内存。在编译时会选取成员中长度最长的来声明。也就是说在如下与程序片段中:union a { //声明了三个成员,但是长度不一(后面sizeof的结果不同机器结果不同,但double肯定是最长的),于是编译器会选取double的长的作为union a的长度 int a1; // sizeof(int) = 4 float a2; // sizeof(float) = 8 double a3; // sizeof(double) = 16 };
也就是说,上述union声明在内存中等同于
struct a { double a3; };
2.根据第一条的特点,在对union成员进行赋值后,要注意使用时一定要调用赋值过的成员。
更多相关内容 -
C语言共用体(C语言union用法)详解
2022-03-10 10:31:32在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{ 成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体的...在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:
union 共用体名{
成员列表
};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体也是一种自定义类型,可以通过它来创建变量,例如:- union data{
- int n;
- char ch;
- double f;
- };
- union data a, b, c;
上面是先定义共用体,再创建变量,也可以在定义共用体的同时创建变量:
- union data{
- int n;
- char ch;
- double f;
- } a, b, c;
如果不再定义新的变量,也可以将共用体的名字省略:
- union{
- int n;
- char ch;
- double f;
- } a, b, c;
共用体 data 中,成员 f 占用的内存最多,为 8 个字节,所以 data 类型的变量(也就是 a、b、c)也占用 8 个字节的内存,请看下面的演示:
- #include <stdio.h>
- union data{
- int n;
- char ch;
- short m;
- };
- int main(){
- union data a;
- printf("%d, %d\n", sizeof(a), sizeof(union data) );
- a.n = 0x40;
- printf("%X, %c, %hX\n", a.n, a.ch, a.m);
- a.ch = '9';
- printf("%X, %c, %hX\n", a.n, a.ch, a.m);
- a.m = 0x2059;
- printf("%X, %c, %hX\n", a.n, a.ch, a.m);
- a.n = 0x3E25AD54;
- printf("%X, %c, %hX\n", a.n, a.ch, a.m);
- return 0;
- }
运行结果:
4, 4 40, @, 40 39, 9, 39 2059, Y, 2059 3E25AD54, T, AD54
这段代码不但验证了共用体的长度,还说明共用体成员之间会相互影响,修改一个成员的值会影响其他成员。
要想理解上面的输出结果,弄清成员之间究竟是如何相互影响的,就得了解各个成员在内存中的分布。以上面的 data 为例,各个成员在内存中的分布如下:
成员 n、ch、m 在内存中“对齐”到一头,对 ch 赋值修改的是前一个字节,对 m 赋值修改的是前两个字节,对 n 赋值修改的是全部字节。也就是说,ch、m 会影响到 n 的一部分数据,而 n 会影响到 ch、m 的全部数据。
上图是在绝大多数 PC 机上的内存分布情况,如果是 51 单片机,情况就会有所不同: -
第十章 结构体_C语言共用体(C语言union用法)详解
2022-02-24 20:33:56在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名 { 成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体...通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:
union 共用体名
{
成员列表
};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体也是一种自定义类型,可以通过它来创建变量,例如:上面是先定义共用体,再创建变量,也可以在定义共用体的同时创建变量:
如果不再定义新的变量,也可以将共用体的名字省略:
共用体 data 中,成员 f 占用的内存最多,为 8 个字节,所以 data 类型的变量(也就是 a、b、c)也占用 8 个字节的内存,请看下面的演示:
运行结果:
4, 4 40, @, 40 39, 9, 39 2059, Y, 2059 3E25AD54, T, AD54
这段代码不但验证了共用体的长度,还说明共用体成员之间会相互影响,修改一个成员的值会影响其他成员。
要想理解上面的输出结果,弄清成员之间究竟是如何相互影响的,就得了解各个成员在内存中的分布。以上面的 data 为例,各个成员在内存中的分布如下:
成员 n、ch、m 在内存中“对齐”到一头,对 ch 赋值修改的是前一个字节,对 m 赋值修改的是前两个字节,对 n 赋值修改的是全部字节。也就是说,ch、m 会影响到 n 的一部分数据,而 n 会影响到 ch、m 的全部数据。
上图是在绝大多数 PC 机上的内存分布情况,如果是 51 单片机,情况就会有所不同:为什么不同的机器会有不同的分布情况呢?这跟机器的存储模式有关,我们将在VIP教程《大端小端以及判别方式》一节中展开探讨。
共用体的应用
共用体在一般的编程中应用较少,在单片机中应用较多。对于 PC 机,经常使用到的一个实例是: 现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格:
Name
Num
Sex
Profession
Score / Course
HanXiaoXiao 501
f
s
89.5
YanWeiMin 1011
m
t
math
LiuZhenTao 109
f
t
English
ZhaoFeiYan 982
m
s
95.0
f 和 m 分别表示女性和男性,s 表示学生,t 表示教师。可以看出,学生和教师所包含的数据是不同的。现在要求把这些信息放在同一个表格中,并设计程序输入人员信息然后输出。
如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前 4 个成员变量是一样的,第 5 个成员变量可能是 score 或者 course。当第 4 个成员变量的值是 s 的时候,第 5 个成员变量就是 score;当第 4 个成员变量的值是 t 的时候,第 5 个成员变量就是 course。
经过上面的分析,我们可以设计一个包含共用体的结构体,请看下面的代码:#include <stdio.h> #include <stdlib.h> #define TOTAL 4 //人员总数 struct{ char name[20]; int num; char sex; char profession; union{ float score; char course[20]; } sc; } bodys[TOTAL]; int main(){ int i; //输入人员信息 for(i=0; i<TOTAL; i++){ printf("Input info: "); scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession)); if(bodys[i].profession == 's'){ //如果是学生 scanf("%f", &bodys[i].sc.score); }else{ //如果是老师 scanf("%s", bodys[i].sc.course); } fflush(stdin); } //输出人员信息 printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n"); for(i=0; i<TOTAL; i++){ if(bodys[i].profession == 's'){ //如果是学生 printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score); }else{ //如果是老师 printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course); } } return 0; }
运行结果:
Input info: HanXiaoXiao 501 f s 89.5↙ Input info: YanWeiMin 1011 m t math↙ Input info: LiuZhenTao 109 f t English↙ Input info: ZhaoFeiYan 982 m s 95.0↙ Name Num Sex Profession Score / Course HanXiaoXiao 501 f s 89.500000 YanWeiMin 1011 m t math LiuZhenTao 109 f t English ZhaoFeiYan 982 m s 95.000000
-
C语言union的用法及好处
2020-10-24 14:30:19Union 的用法以及好处 什么是Union? union 共用体名{ 成员列表 }; union,“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。 ...Union 的用法以及好处
- 什么是Union?
union 共用体名{
成员列表
};union,“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。
结构体和共用体的区别在于: 结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
- 为什么使用union?
1.解决“相同信息”的困扰,避免重复代码,提高代码的简洁性。
相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合。
2.节省内存
C语言程序常用于资源比较紧张的嵌入式设备中,因此合格的C语言程序员应该都是“抠门”的,尽可能的节约资源。如果一些数据不可能在同一时间同时被用到,则可以使用union。
- 如何使用union?
Video info 是用于描述视频信息的结构体
有视频的地方常常也会有音频,所以我们的C语言程序还需要描述音频信息。音频信息也包括名称、地址、时间等信息,不过它也有与视频不同的参数,例如采样率,通道数。所以使用C语言描述音频信息,可以使用下面这个结构体:
这样一来,C语言程序描述视频和音频就简单了,只要使用 video_info 和 audio_info 结构体就可以了:
但是video_info 和 audio_info 仅个别成员不同,可以合并同类项:
合并以后需要描述视频和音频时,都使用 av_info 结构体:
不过,这样虽然将 video_info 和 audio_info 的重复代码合并了,同样也导致结构体所占用的内存变大了。同时代码的耦合性增强:用于描述视频的 vinfo 也能访问音频才有的 chnnl_cnt,用于描述音频的 ainfo 也能访问视频的 alg。
那这种情况下,C语言有没有办法,既能避免重复代码,又能避免耦合,同时还能节约资源呢?自然是有的,C语言中的 union 语法就是为此而设计的:
因为视音频都有名称、地址、大小信息,所以 av_info 中的 name,address,size 成员在描述视频和音频时都会被使用。视音频具有差异的几个成员则使用 union 描述,union 中的 vinfo和 ainfo 共用一块内存区域。
此时访问视频的编码算法和时间信息,可以如下实现:
访问音频的采样率和通道数,可以如下实现:
从上面这几行C语言代码可以看出,此时视音频的相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合。另外,由于union 中的 vinfo和 ainfo 共用一块内存空间,内存浪费的问题也解决了。这里说的节省内存,是相对于直接合并video_info 和 audio_info那种情况的节省。
这里继续补充一下ip地址的情况:
有ipv4自然就会有ipv6,所以一个结构体最好能同时描述出ipv6和ipv4。
这样子的话,就会省去很多重复的代码,不必为ipv4和ipv6分别定义两个结构体,只需要一个结构体就能描述它们了。
另一种节省内存的方式:
数据不会被同时应用。比如变量a 仅仅只是作为函数开头的一个循环控制值,退出循环后既不做返回值,也不作它用,这时候它所申请的栈内存空间的浪费的。b用作循环后面计算浮点数的,这时候使用union定义这个两个变量确实会节省内存
-
C语言中的union使用方法
2021-05-23 08:35:27共用体表示几个变量共用一个内存位置,在不同的时间保存不同...2、union成员共享同一块大小的内存, 一次仅仅能使用当中的一个成员。3、对某一个成员赋值,会覆盖其它成员的值(由于他们共享一块内存。但前提是成员所... -
C语言中Union类型的使用方法
2022-04-26 08:27:09使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型,各字段共享一块内存,实际应用中却不知道它的具体用途。 struct为每个字段在不同的偏移处分配存储空间,而联合则将所有的字段重叠... -
C语言Union的使用
2017-11-21 09:28:55使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型,各字段共享一块内存,实际应用中却不知道它的具体用途。 今天读《编程卓越之道》中看到有对其使用的简单介绍,记录在此: ... -
c语言union用法总结
2021-05-24 08:01:37开始的话已经好长时间没有更新了,对不起...别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看... -
C语言 Union的用法 和 大小端的判断
2018-03-22 20:19:22union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。... -
C语言中联合体union的实例详解
2020-08-29 05:29:58主要介绍了 C语言中联合体union的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下 -
C语言 C++中的union用法总结(包懂)
2021-03-08 22:50:26别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结... -
超详细C语言联合体union详解
2021-09-22 16:18:41上一期C语言快速入门我们学习了枚举类型及相关知识点,这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你一定会有所收获! 提示:以下是本篇文章正文内容,下面案例可供参考 一、联合(共用体)定义 联合是... -
C语言中Union与struct知识汇总
2021-06-09 15:30:26这里写自定义目录标题结构体struct定义结构体的三种方式结构体大小计算结构体的自引用结构体数组与结构体指针联合体...C语言中Union与struct知识汇总 结构体struct 你好! 这是你第一次使用 Markdown编辑器 所展示的 -
C语言、C++中的union用法总结
2020-12-31 14:16:33别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结... -
c语言联合union的使用用途
2021-05-18 09:35:43在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处。我在网上看到还有其他的用途:1、分离高低字节这个需要结合cpu大小端来判断,原文如下:这样的操作,而一个除法消耗四个机器周期,取余也需要... -
C中Union的巧妙用法
2020-07-25 03:09:50union巧妙地实现多字节数据类型之间的转化;使不同数据包兼容。 -
C语言 Union和Struct成员赋值问题
2020-01-14 18:25:46union { uint32_t _32; uint16_t _16; uint8_t _8[2]; }gpr[8]; uint32_t eax = gpr[0]._32; uint32_t ecx = gpr[1]._32; }CPU_State; int main() { CPU_State cpu; //先测试gpr0和gpr2 ... -
C语言小结——联合体(union)使用方法及其本质
2021-05-18 09:34:37C语言总结——联合体(union)使用方法及其本质有些基础知识快淡忘了,所以有必要复习一遍,在不借助课本死知识的前提下做些推理判断,温故知新。1.联合体union的基本特性——和struct的同与不同union,中文名“联合体... -
C语言学习之共用体union
2021-01-06 07:09:42以前在学习c语言的时候,有接触过共用体。 彼时对共用体Union的理解无非就是: union { int a; int b; char c; } 对union内的任意成员赋值都会覆盖掉其他成员,当时觉得很好理解,觉得懂了。 但是对于共用... -
C语言-联合体union
2022-05-12 19:12:32C语言-联合体union -
【C语言基础】共用体Union的使用技巧
2021-09-17 10:23:21共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余... -
C语言union关键字的意义和用法
2021-05-18 17:04:47union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。... -
(转)C语言union(联合体 共用体)
2021-05-24 10:29:27一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住。这次看书又看到了,还是学习一下吧。一般在Windows API的...2、union成员共享同一块大小的内存,一次只能使用其中的一个成员。3、对某一个...