1. 联合简介

联合(union)是一种数据类型,他能在同一块空间中存储不同数据类型,但不是同时存储。如果我们想设计一种结构,其能存储一些既无规律,也无顺序的数据,那么就可以用到联合。

创建联合和创建结构体相同,需要声明一个模板,再用这个模板创建变量,下面给出例子:

union STU
{int num;char sex;double score;char name[32];
};

根据上面声明,该结构可以存储一个int类型,一个char类型,一个double类型和char类型的数组。然而,创建出的变量只能存储上面所说的类型的一种。而且该变量的大小,为模板中所占字节数最大的那个类型决定,本例中为32字节(char name[32])。

和结构体相同,我们可以运用模板创建和STU相关的变量:

union STU ustu1;     // STU类型的联合变量           32字节
union STU ustu2[10];    // 内含10个联合变量的数组     10*32 字节
union STU *ustu3;        // 指向STU类型联合变量的指针   4字节(32位编译器)

2. 联合的初始化

和结构体不同的是,联合只能存储一个值,所以他的初始化就比较独特:

union STU ustu1;
ustu1.sex= 'm';
union STU ustu2 = ustu1;               // 用另一个联合来初始化
union STU ustu3 = {32};                    // 初始化联合的第一个成员 num
union STU ustu4 = {.score = 85.6};        // 指定初始化器

3. 使用联合

  • 用法1
 ustu1.num = 12;            // 把12存储在ustu1 中,占4字节ustu1.score = 96.6;        // 清除12,存储 96.6,占8字节ustu1.sex = 'f';           // 清除96.6,存储 f,占1字节

. 运算符 和 -> 运算符访问联合内的成员的方法和结构体差不多,不过有一点要注意,联合一次只能存储一个值,就算有足够的空间,也不能同时存储和访问两个类型不同的值。比如:

ustu1.num = 12;
puts(ustu1.name);

这种用法是错误的,因为上一行存储在ustu1里面的是 int类型,但是下一行输出的确实ustu1 的char型数组,这种编译器可能不报错,但是输出结果确实未知的。

  • 用法2
struct STU
{int number;char sex;double score;char name[32];
};struct TEACH
{int number;char sex;char name[32];char department[64];double salary;
};union INFO
{struct STU stu[50];struct TEACH teach[10];
};struct PEOPLE
{enum {TEACHER, STUDENT}        type;       union INFO info;
};struct PEOPLE people;

我们用struct PEOPLE 定义了一个结构体变量people, 那我们就可以用这个函数来获取第N位老师/学生的编号:

int get_number(struct PEOPLE *people, int N)
{if(TEACHER == people->type){return (people->info.teach[N].number);}else{return (people->info.stu[N].number);}
}

当people的type的成员为TEACHER时,它的info成员为老师,
当people的type的成员为STUDENT时,它的info成员为学生,
同理,可获得老师/学生其他信息。

这段代码虽然得到了我们想要的结果,但是有个缺陷。之前我们提到,联合的大小,为其内部结构中最大的那个结构的大小,如图:

STU的大小为48,TEACH的大小为112,联合INFO中有50个STU,所占内存为5048=2400,20个TEACH,所占内存为10112 = 1120,所以,联合的大小为2400,但当联合存储的是较小的成员,像TEACH,就本例而言,足足浪费了1280字节。在这种情况下,更好的方法是在联合中存储指向不同成员的指针而不是直接存储成员本身。因为所有的指针长度都是一样的,这样就解决了内存浪费的问题。

改写联合声明:

union INFO
{struct STU *pStu;struct TEACH *pTeach;
};

内部就可以用链表来存储数据了。

4. 匿名联合

匿名联合和匿名结构的工作原理相同,即匿名联合是一个结构或联合的无名联合成员。例如,我们重新定义struct PEOPLE结构:

struct STU
{int number;char sex;double score;char name[32];
};struct TEACH
{int number;char sex;char name[32];char department[64];double salary;
};struct PEOPLE
{enum {TEACHER, STUDENT}        type;union INFO{struct STU stu[50];struct TEACH teach[10];};
};struct PEOPLE people;

这下我们如果再想获取获取第一个学生的学号,就可以用:

people.stu[0].number;

来代替

people.info.stu[0].number;

C语言 联合(union)相关推荐

  1. union在c语言中的作用,c语言联合union的使用用途

    在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处. 我在网上看到还有其他的用途: 1.分离高低字节 这个需要结合cpu大小端来判断,原文如下: 这样的操作,而一个除法消耗四个机器周期 ...

  2. c语言枚举3位数相加等于10,C语言 联合和枚举

    联合(union): 一.联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量. 联合说明和联合变量定义与结构十分相似.其形式为: union 联合名 { 数据类型 成员名; 数 ...

  3. AAAI 2019 | 基于不同颗粒度语言联合训练的表示学习

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  4. C/C++中的联合 union

    联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合.怎么去用.有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还 ...

  5. KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇编设置】【C语言联合汇编】【use microlib选项】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

  6. C语言之union共同体

    C语言之union共同体 文章链接 知识点 union共同体的定义: union空间长度的分配: 共同体个变量相互影响及原因: union的使用样例: 新名词记录{union共同体:Unicode:} ...

  7. C语言数据类型:联合(union)

    1. 联合说明和联合变量定义     联合也是一种新的数据类型, 它是一种特殊形式的变量.     联合说明和联合变量定义与结构十分相似.其形式为:      union 联合名{           ...

  8. c语言联合有什么作用,C语言union共用体(联合体)基础知识及实际用途

    union我想应该不是为了省内存而创建的吧!能省多少内存呢? 我猜测是:一个空间可以同时使用多种类型,而不必在意数据类型,因为我们可以通过里面的数值判断数据类型.(可参考动态语言Lua/Python) ...

  9. [C语言 - 12] Union联合

    union Student { int age; char *name; } stu; union只按照最长的数据成员分配控件,适用于有N个数据不会同时出现的情况,用以压缩空间. 转载于:https: ...

最新文章

  1. 桌面虚拟化之远程协助
  2. 【小白学PyTorch】13.EfficientNet详解及PyTorch实现
  3. ITK:图像阈值演示可用的阈值算法
  4. WEB小知识学习集锦
  5. 电大计算机网络本作业1,2017年最新电大计算机网络作业1-3答案.doc
  6. python PIP包管理工具安装
  7. [c#基础]关于const和readonly常见的笔试题剖析
  8. cdn网络加速原理剖析
  9. 女士品茶 | The Lady Tasting Tea | 统计学史
  10. 中国管理实践的大趋势
  11. logogogo最新变种XP.exe的分析(Win32.Logogo)
  12. android键盘怎么打韩文,手机韩文输入法九键盘如何使用?
  13. 打造高铁WiFi新体验,中兴新支点ICG与高铁强强联手
  14. [C++]typedef typename什么意思?
  15. 域控知识与安全01:域控知识基础
  16. web前端项目(一) 做一个网易考拉官网 常规静态页面 + 页面放到http服务 + 前后端分离
  17. 科教导刊杂志科教导刊杂志社科教导刊编辑部2022年第9期目录
  18. ajax获取php页面数据,ajax如何取php页面的数据
  19. Java系列技术之Mybatis3-钟洪发-专题视频课程
  20. 采用灰度分组统计方法实现图像中值滤波

热门文章

  1. 可视化工具BI(superset,redash)
  2. linux中mv命令的使用
  3. windows supervisor-win
  4. 解决处理Windows server 2016远程桌面授权
  5. 8K超高清企业获广东省专精特新称号,背后意味着什么?
  6. C语言字符串输入及输出的几种方式
  7. 科华生物创始人唐伟国因病去世:年66岁 公司有员工近2000人
  8. good things
  9. C语言关键字const详细讲解
  10. 百度地图JavaScript简单标点连线