union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

但在“联合”中, 各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度 。一个联合体类型必须经过定义之后, 才能使用它,才能把一个变量声明定义为该联合体类型。

当定义结构对象时,如果没有显式地初始化它们,则会采用一般初始化规则:如果该结构对象属于动态存储类型,那么其成员具有不确定的初始值。

另一方面,如果结构对象具有静态存储周期,那么其非指针成员初始值是 0,其指针成员初始值是空指针。

不同于结构成员——它们在结构中都具有单独的内存位置,联合成员则共享同一个内存位置。也就是说,联合中的所有成员都是从相同的内存地址开始。因此,可以定义一个拥有许多成员的联合,但是同一时刻只能有一个成员允许含有一个值。联合让程序员可以方便地通过不同方式使用同一个内存位置。

一、定义联合(union)

联合的定义方式与结构是一样的,只是把关键字 struct 改成 union:

union [标签名称]{成员声明列表};

下面的例子定义了一个名为Data的联合类型,它有 3 个成员:i、x 和 str:

union Data { int i;double x;char str [16];};

这种类型的对象可以存储一个整数、一个浮点数或一个短字符串。

例如:

union StateMachine

{

char character;

int number;

char *str;

double exp;

};

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。

在C++里,union 的成员默认属性页为public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用union。

二、初始化联合(union)

与结构类似,通过初始化列表(initialization list)来初始化联合对象。但是,对联合来说,列表只有一个初始化器(initializer)。

与结构一样,C99 允许在初始化器中使用成员指示符来指示哪个成员被初始化。而且,如果初始化器没有成员指示符,那么就与联合内的第一个成员关联。具有自动存储类的联合对象也可以使用已有的同类型对象来初始化。下面是一些初始化例子:

union Data var1={77},

var2={.str="Mary"},

var3=var1,

myData[100]={{.x=0.5},{1},var2};

数组 myData 中的元素如果没有指定初始化器,会被隐式地初始化为 0 值。

三、联合体变量的声明

联合变量的说明和结构变量的声明方式相同, 也有三种形式:

第一种 , 先定义联合体类型,再声明联合体变量 ;

第二种 ,定义联合体类型的同时声明联合体变量;

第三种 ,直接声明联合体(以匿名的形式定义联合体类型)。

以perdata类型为例,说明如下:

第一种, 先定义联合体类型,再声明联合体变量

union   perdata

{

int class;

char officae[10];

};

union   perdata  a,b;  /*说明a,b为perdata类型*/

第二种, 定义联合体类型的同时声明联合体变量:

union  perdata

{

int class;

char office[10];

} a , b ;

第三种, 直接声明联合体(以匿名的形式定义联合体类型):

union

{

int class;

char office[10];

}a,b

经说明后的a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。对a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。

四、联合体变量的赋值和使用

对联合体变量的赋值,使用都只能是对变量的成员进行。

联合变量的成员表示为:  联合变量名 . 成员名

例如,a被说明为perdata类型的变量之后,可使用 a.class,a.office

不允许只用联合变量名作赋值或其它操作。 也不允许对联合变量作初始化赋值,赋值只能在程序中进行。

一个联合体变量, 每次只能赋予一个成员值。一个联合变量的值就是联合变员的某一个成员值。

五、struct和union和区别

1.结构和联合都是由多个不同的数据类型成员组成的,但是在任一时刻联合只存放一个被选中的成员,而结构的所有成员都存在。

2。对于联合的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对结构的不同成员赋值是会不影响的。

对联合变量的赋值,都只能对变量的成员进行,一个联合变量每次只能赋值给一个成员,一个联合变量的值就是当前联合变量的某一个成员值。

应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!

C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍:

编程学习视频:

C语言丨关键字union的定义和使用相关推荐

  1. C语言丨关键字enum用法详解,看这篇就够了

    一.关键字enum的定义 enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类 ...

  2. C语言:关键字---union(声明共用体类型)

    C语言32个关键字 有32个关键字详细说明,还有跳转链接! 一.union 简介 union 是C语言中一种声明共用体的数据类型. union(共用体)在某种程度上类似struct(结构体)的一种数据 ...

  3. C语言丨关键字signed和unsigned 的使用与区别详解

    在C语言中,signed/unsigned用于修饰整数变量,signed表示有符号的,unsigned表示无符号的. 今天就带大家了解一下 关键字signed和unsigned . 1.signed ...

  4. Java语言的关键字

    Abstract 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可以被其它类继承.一个抽象类可以使用抽象方法,抽象方法不需要实现,但是需要在子类中被实现 brea ...

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

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

  6. c语言字母表关键字,读书笔记-C语言关键字

    001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内 ...

  7. c语言中switch语句流程图_C语言:C语言保留字(关键字)

    保留字(reserved word) 保留字又称关键字. 指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用. 每种程序设计语言都规定了自己的一套保留字. 例如:BASIC语言规 ...

  8. C语言的关键字 详解

    一.C语言的关键字 C语言中的32个关键字及其意思如下: 由 ANSI 标准定义的C 语言关键字共32 个.根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 1.数据类型关键字 ...

  9. C语言标准ANSI C、C语言的特点、C语言的关键字(32个)

    C语言标准:通常称为ANSI C. C语言的特点: 1.C语言简洁.紧凑,使用方便.灵活.ANSI C一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示,压缩了一切不必要的成分. 2 ...

最新文章

  1. Linux 运维工作中的经典应用ansible(批量管理)Docker容器技术(环境的快速搭建)...
  2. AlarmManager机制和系统唤醒锁的总结
  3. 用chrome模拟微信浏览器访问需要OAuth2.0网页授权的页面
  4. SCI论文从入门到精通(一)——如何选题
  5. pb实现简单计算器的思想_人教版初中数学七年级下册 用计算器求算数平方根、用有理数估计算数平方根的大小公开课优质课课件教案视频...
  6. 图吧工具箱2021最纯净的电脑硬件工具箱
  7. matlab可靠性优化,齿轮减速器可靠性优化的MATLAB实现
  8. 基于Windows XP SP3系统下MS08067漏洞攻击
  9. sis最新ip地址2020_2020 前端面试 | 第一波面试题总结
  10. 浅析Minecraft直播弹幕模组BakaDanmaku源码
  11. 裸辞计算机考研,一位工作三年,裸辞,跨考,347学姐的考研经验 - 考研 - 小木虫 - 学术 科研 互动社区...
  12. 变量之间的相关性度量
  13. 2022年10月最新CPU天梯图 CPU天梯图高清完整版
  14. Spring Cloud Bus-用法和意义
  15. IDEA 中使用 Big Data Tools 连接大数据组件
  16. EJB教程_编程入门自学教程_菜鸟教程-免费教程分享
  17. 服务器数据库异常MySQL_服务器 mysql数据库异常
  18. c语言disp函数_disp 在matlab中是什么意思
  19. 当程序员遇上电信诈骗犯 黑掉对方电脑!成功反制
  20. 基于Java毕业设计志愿者管理系统演示录像2020源码+系统+mysql+lw文档+部署软件

热门文章

  1. Cadence Allegro PCB丝印字体大小设置
  2. 使用reveal.js制作精美的网页版PPT
  3. bzoj4695: 最假女选手 (分块纪念)
  4. Codeforces Round #673 (Div. 2) Sep/27/2020 23:05UTC+8
  5. android界面赏析,Android L的UI赏析 部分比苹果iOS 8更赏心悦目
  6. 用华为拼音输入法组的两首诗
  7. xlrd和xlwt模块
  8. Shader做剪影效果
  9. 算法设计与分析-分支限界法习题
  10. 《满江红·写怀》 岳飞