联合体union的基本概念

在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int、一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元中,这3个变量虽然在内存中占的字节数不同,但都从同一地址开始,使用覆盖技术,后一个数据覆盖了前面的数据。这便是联合体union(或者叫共用体)诞生的目的所在。其主要特点是:

union中可以定义多个成员,union的大小由最大的成员的大小决定union成员共享同一块大小的内存,一次只能使用其中的一个成员对union某一个成员赋值,会覆盖其他成员的值

从上面也可以看出,联合体与C语言中的结构体有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。

联合体union的定义方式

在C/C++语言中,常见的3种定义方式如下:

声明的同时定义变量先声明,再定义变量匿名定义变量

下图给出了3种定义方式的一个例子:

联合体union的使用例子

使用联合体类型,可以实现一些我们意想不到或其它编程语言很难做到的功能,下面给出2个例子。

(1) 将一个32位的整型数拆分为4个单字节的数

如将一个数0x12345678拆分为4个单字节的数为:0x78、0x56、0x34、0x12,则主要实现代码如下:

使用上面代码,可将0x12345678按地址顺序从低到高依次拆分为4个单字节的数:0x78、0x56、0x34、0x12。

(2) 判断当前操作系统的字节序的大、小端问题

主要原理为:在联合体中定义一个4字节整数i和一个单字节整数ch,且赋值i为1(16进制表示为0x00 00 00 01),利用联合体中所有变量共享内存区域的特性,若系统是小端序,则该联合体的低地址端存放的是数值i的低位字节(0x01),反之,若系统是大端序,则存放的是数值i的高位字节(0x00),那么可根据ch的值(存放在该联合体的低地址端,非0即1)来判断当前系统的字节序问题。对应的实现函数代码如下:

对于上面2个例子,完整的实现代码如下:

运行结果如下图所示:

C/C++语言中联合体union的妙用相关推荐

  1. C语言学习—联合体Union和关键字Typedef

    C语言学习-联合体Union和关键字Typedef 前言 1 联合体Union 1.1 Union认知 1.2 Union应用 2 关键字typedef 前言 内容主要为联合体Union和关键字Typ ...

  2. C语言中-条件编译#ifdef的妙用详解_透彻

    本文主要介绍c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define     ...

  3. C语言 C++中的union用法总结(包懂)

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...

  4. C++中的union(联合体,共用体,数据变量可以共享内存,以节省内存空间)

    union介绍 C++的union本质上也是个类,跟struct性质几乎一致但是有一个最大的区别,数据共享内存. 说到共享内存就要说下union的内存分配:union的大小是按照union里面的成员内 ...

  5. union c语言什么意思,C语言、C++中的union用法总结(包懂)

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这 ...

  6. php union用法,C++_C语言、C++中的union用法总结,开始的话 已经好长时间没有 - phpStudy...

    内存对齐的问题了).而对于union来说,在谭浩强的<C语言程序设计>中这么说:union变量所占用的内存长度等于最长的成员的内存长度.很显然,这是不对的,对于union所占用的内存大小, ...

  7. C++中的union介绍

    union介绍 共用体,也叫联合体,在一个"联合"内可以定义多种不同的数据类型, 一个被说明为该"联合"类型的变量中,允许装入该"联合"所定 ...

  8. C语言union合并两个字节,C语言中的联合体union所占内存方式

    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: 2)它的所有成员 ...

  9. 联合体c语言指针,C++中联合体(union)的使用

    typedef union para { double tmp[]; struct { double a; double b; double c; double d; }NP; }NPara; //或 ...

最新文章

  1. php支付密码控件,vue支付密码的图文实例
  2. linux系统内核流转浅析
  3. gnome3.2 安装体验
  4. 云炬随笔20171203
  5. linux服务器不能访问,无法在远程Linux服务器上访问tomcat
  6. 系统运维tips 3 之 innodb
  7. wordpress插件 WBOLT百度推送管理 3.4.6 Pro PJ
  8. python 用命令安装pip_用pip命令安装Python第三方库
  9. 【机器学习】Andrew Ng——02单变量线性回归
  10. PMP备考笔记--1.1
  11. 遇到一个不得其解的问题。
  12. 嵌入式系统一般用c语言编写,ARM嵌入式系统C语言编程
  13. win10镜像文件能直接安装吗
  14. 企业邮箱的优势有哪些?使用企业邮箱的好处
  15. Linux下同一个Tomcat部署多个项目不同端口访问
  16. GLES2.0中文API-glFramebufferRenderbuffer
  17. 汽车使用总结(三)--汽车里播放无损音乐的5种方法,极少人知道的秘密,音质瞬间提高
  18. W5500参考电路图
  19. “面子”真的那么重要吗?——2017过年返乡见闻与思考
  20. Oracle 换库时发生 Connections could not be acquired from the underlying database

热门文章

  1. pythonargmaxaxis1_详解numpy的argmax的具体使用
  2. html背景自动换,html页面换皮肤颜色、背景图片(更换页面背景,常驻缓存)刷新保存...
  3. java web 图书管理系统_图书管理系统,源代码 Java初级小项目
  4. python验证卡普耶卡(D.R.Kaprekar)6174猜想
  5. [C#] - 从 HTML 代码中 转换 / 提取 可读文字(PlainText)的方法
  6. java集合框架03
  7. LintCode-第k大元素
  8. UAC 实现原理及绕过方法
  9. 三大趋势在移动互联网发展
  10. 替换a链接的href和title