一、概念

  中文称为共用体或联合体。主要用于共享内存,在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。

  在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

二、举例

(1)用union判断大小端

  union var

  {

    char c[4];

    int i;
  };

  int main()

  {
    var data;
    data.c[0] = 0x04;
    data.c[1] = 0x03;
    data.c[2] = 0x02;
    data.c[3] = 0x11;

    //数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
    //而把四个字节作为一个整体,应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
    printf("%x\n",data.i);
  }

  结果:
        11020304       //证明是小端(little-endian)

(2)含有struct的union

  void main()
  {
    union number
    {
      int i;

      struct

      {
        char first;
        char second;
      }half;

    }num;
    num.i=0x4241; /*联合成员赋值*/
    printf("%c%c/n", num.half.first, num.half.second);
    num.half.first='a'; /*联合中结构成员赋值*/
    num.half.second='b';
    printf("%x/n", num.i);
  }
输出结果为: 
  AB 
  6261

三、带对象的union

  由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

转载于:https://www.cnblogs.com/chakyu/p/7411403.html

C/C++ union相关推荐

  1. Python type hints 之 Optional,Union

    1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...

  2. C++ 共用体union 的使用

    共用体是什么 共用体将不同的数据类型组织为一个整体, 需要注意的是,共用体在同一时刻只能存储一个数据成员的值., 共用体变量的地址和它的格式成员的地址都是同一地址 共用体的一般形式 union 共用体 ...

  3. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  4. 联合体union和大小端(big-endian、little-endian)

    1.联合体union的基本特性--和struct的同与不同 union,中文名"联合体.共用体",在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(s ...

  5. struct和union的大小问题

    union类型以其中size最大的为其大小 struct类型以其中所有size大小之和为其大小 #include<iostream> using namespace std; int ma ...

  6. 利用c语言结构体和union实现类似c++的public,private的实现

    最近在看strongswan源代码,看到strongswan的代码框架很有意思,用C语言实现类的思想.当我们编写完一个模块,我们需要提供的是H的文件给其他模块使用,我们希望H文件中就只能包含一些公有函 ...

  7. php union all,Union与Union All的区别

    Union与Union All的区别 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或称为联合)的作用是将多个结果合并 ...

  8. mysql join union_MySQL中union和join语句使用区别的辨析教程

    union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确. 先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同 ...

  9. C++/C union使用记一下锅

    //首先,学习编程一定要记得加几个群或者加几个讨论组,因为这样你才能不断地进步还有吵架/滑稽 记一下 关于使用union结构体时遇到的一些坑 To zero-initialize an object ...

  10. 索引系列八--索引特性之有序难优化union

    ----UNION 是需要排序的 drop table t1 purge; create table t1 as select * from dba_objects where object_id i ...

最新文章

  1. mysql获取配置文件信息,四种获取MySQL数据库配置文件加载顺序
  2. 【django轻量级框架】(Python3.6.8+Django2.0)第一个Django项目与基础环境搭建
  3. 秀秀的森林(forest)
  4. jQuery Mobile学习笔记
  5. 七十、Vue城市页面Ajax动态渲染和兄弟组件数据传递
  6. java画图板代码_java学习小总结——画图板制做(附代码)
  7. 中文新闻分类 数据集_三亚试点用大数据推行垃圾分类:刷卡扔垃圾,分类有奖励|界面新闻...
  8. 全球首发!计算机视觉Polygon Mesh Processing总结9——Triangle-Based Remeshing
  9. ***性测试是一种特殊的信息安全服务
  10. 多校 HDU 6313 Hack It——构造
  11. MFC消息映射及消息处理函数原型
  12. 解决vscode下载很慢的问题
  13. 积分形式的詹森不等式_均值不等式及其积分形式
  14. xshell6上传文件到linux,xshell上传文件到虚拟机中
  15. 5g无线图传信号测试软件,不到千元的5G无线图传?小试致迅CineEye
  16. Either类java_通过实例学习Either 树和模式匹配
  17. 消息称:华为将官宣为全国老款手机内存扩容
  18. Activiti工作流(一):OA 上的那些请假流程如何快速实现呢?
  19. centos7下安装forever_CentOS7 安装和部分设置参考
  20. 8.PS-快速掌握人物祛斑

热门文章

  1. 增强型的for循环linkedlist_38. 为什么千万别用for循环迭代LinkedList
  2. 月历1997年php代码_php自动生成月历的代码
  3. mysql数据库用doc命令,myMySQL数据库怎么使用dos命令安装? MySQL数据库使用教程
  4. python 保存dataframe_在python2中将dataframe保存到CSV
  5. 利用Caffe训练模型(solver、deploy、train_val)+python使用已训练模型
  6. 如何获得查询的执行计划?(一)
  7. Java学习之——泛型
  8. JS杂谈系列-jquery-插件开发小记
  9. RDLC使用手册_RDLC报表部署
  10. 与众不同 windows phone (23) - Device(设备)之硬件状态, 系统状态, 网络状态