文档章节

第14章 结构和其他数据形式 14.10 联合简介

idreamo
 idreamo
发布于 2017/03/25 08:18
字数 1372
阅读 22
收藏 0

联合(union)是一个能在同一个存储空间里(但不同时)存储不同类型数据的数据类型。一个典型的应用是一种表,设计它是用来以某种即没有规律,事先也未知的顺序保存混合类型数据。使用联合类型的数组,可以创建相同大小单元的数组,每个单元都能存储多种类型的数据。

联合是以与结构相同的方式建立的,也是需要一个联合模板和一个联合变量。可以在一步中定义它们也可以使用联合标记在两步中定义。下面是一个带有标记的联合模板的例子:

union hold {

    int digit;

    double bigfl;

    char letter;

};

具有类似声明的结构可以含有一个int类型数值和一个double类型数值以及一个char类型数值,而这个联合可以含有一个int类型数值或一个double类型数值或一个char类型数值。

下面是定义3个hold类型联合变量的例子:

union  hold  fit;    //hold类型的联合变量

union  hold  save[10]    //10个联合变量的数组

union  hold  *pu;    //指向hold类型变量的指针

第一个声明创建一个变量fit。编译器分配足够的空间以保存所描述的可能性的最大需求。在这种情况下,列出的最大可能性是double型数据。在我们的系统里,它需要64位,即8个字节。第二个声明创建了一个save数组,它含有10个元素,每个元素大小为8个字节。第三个声明创建了一个指针,可以存放一个hold联合的地址。

可以初始化一个联合,因为联合只存放一个值 ,所以初始化的规则与结构的初始化不同。具体地,有3种选择:可以把一个联合初始化为同样类型的另一个联合;可以初始化联合的第一个元素;或者按C99标准,可以使用一个指定初始化项目。

union hold valA;
valA.letter='R';
union hold valB = valA;        //把一个联合初始化为另一个联合
union hold valC = {88};        //初始化联合的digit成员(第1个元素)
union hold valD = {.bigfl = 118.2};  //指定初始化项目

下面示例了怎样使用联合:

fit.digit = 23;    //把23存储在fit中,使用2个字节
fit.bigfl = 2.0;   //清除23,存储2.0;使用8个字节
fit.letter = 'h';  //清除2.0存储'h';使用1个字节

点运算符表示正在使用哪种数据类型。在同一时间只能存储一个值。即使有足够的存储空间,也不能同时保存一个char类型和一个int类型。由您负责记住当前保存在联合中的数据的类型。

如同与指向结构的指针一起使用->运算符一样,可以与指向联合的指针一起使用->运算符:

pu = &fit;
x = pu->digit;  //相当于 x = fit.digit

接下来显示了什么是不能做的:

fit.letter= 'A'; 
flnum = 3.02*fit.bigfl;  //错误

这个语句序列是错误的,因为存储了一个char类型,而接下来的一行却假定fit的内容是double类型的

但是,使用一个成员来将值保存到一个联合中,然后使用一个不同的成员来查看这些内容,这种做法有时会很有用。下一章的程序清单15.4就给出这样一个例子。

另一个可能会使用联合的地方是在某些结构中,该结构所存储的信息有赖于其中的一个成员。例如,假定有一个表示一辆汽车的结构。如果汽车归属于使用者,就要一个结构成员来描述这个所有者。如果汽车被租赁,需要一个成员来描述租赁它的公司。那么使用下面的语句行,可以做些事情 :

struct owner {
    char socsecurity[12];
    ...
};

struct leasecompany{
    char name[40];
    char headpuarters[40];
...
};

union data {
    struct owner owncar;
    struct leasecompany leasecar;
};

struct car_data {
    char make[15];
    int status;    /*0=私有,1=租赁*/
    union data ownerinfo; 
    ...
};

假定flits是一个car_data结构。那么如果flits.status是0,程序就可以使用fits.ownerinfo.owncar.socsecurity; 如果flits.status是1,程序就可以使用flits.ownerinfo.leasecar.name。

 

总结 :结构和联合运算符

成员运算符:

总体注解:

        运算符和结构或联合名称一起使用,用来指定结构或联合的成员。如果name是一个结构名,member是一个由结构模板指定的成员,下面就表示了该结构的这个成员:

        name.member

        name.member的类型就是member的类型。成员运算符也可以用同样的方式用于联合。

间接成员运算符:

    ->

        总体注解:

        这个运算符与指向结构或联合的指针一起使用,用来指明结构或联合的成员 。假设ptrstr是一个指向结构的指针,member是由该结构模板指定的一个成员。那么:

        ptrstr->member

        这个表达式表示被指向结构的成员。间接运算符也可以用同样的方式用于联合。

例如:

       

struct {
    int code;
    float cost;
} item,*ptrst;

ptrst = &item;
ptrst->code=3451;

 最后一条语句将一个int 值赋给item的成员code。以下三个表达式是等价的:

ptrst->code  item.code    (*ptrst).code

© 著作权归作者所有

idreamo
粉丝 17
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
《Oracle数据库基础与应用教程》一本Oracle入门教材

《Oracle数据库基础与应用教程》书全面讲述了Oracle数据库的日常管理工作内容。全书共14章,包含Oracle简介和安装、Oracle客户端、管理Oracle环境、Oracle体系结构、管理Oracle存储结构、SQL...

airfish2000
2016/08/30
0
0
每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

本周为大家送出的书是《Oracle 12 c PL(SQL)程序设计终极指南》,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著。 内容简介: 《Oracle 12c PL/SQL程序设计终极指南》志在打造PL/SQL领...

zting科技
2017/12/11
0
0
好书推荐.flask.>

图书封面: 书籍简介: 1. 学习Flask应用的基本结构,编写示例应用; 使用必备的组件,包括模板,数据库,Web表单和电子邮件支持; 使用包和模块构建可伸缩的大型应用; 实现用户认证,角色和个人资...

满满李
2016/06/03
97
0
【书评:Oracle查询优化改写】第14章 结尾章

【书评:Oracle查询优化改写】第14章 结尾章 一.1 相关参考文章链接 前13章的链接参考相关连接: 【书评:Oracle查询优化改写】第一章 http://blog.itpub.net/26736162/viewspace-1652985/ 【书...

技术小胖子
2017/11/08
0
0
Docker进阶与实战_帝都客_ pdf扫描版_完整版_资源免费下载

《Docker进阶与实战》由机械工业出版社出版。 PDF下载地址 :http://www.diduker.com/html/4640.html PDF相关截图 : 编辑推荐 作者简介 华为Docker实践小组,致力于容器技术探索,结合华为C...

909636801
2018/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开发函数计算的正确姿势 —— 移植 next.js 服务端渲染框架

首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准...

阿里云云栖社区
40分钟前
1
0
Windows获取其他进程中Edit控件的内容

最近做的MFC项目中,有个获取其他进程中Edit控件内容的需求,本来以为是个很简单的问题,但是来来回回折腾了不少时间,发博记录一下。   刚开始拿到这个问题,很自然的就想到GetDlgItemTex...

WinkJie
45分钟前
0
0
Mysql数据库基于流量审计mysql-sniffer部署

Base Enviroment:CentOS release 6.5 +10.1.40-MariaDB MariaDB Server 安装完后,经过Navicat客户端工具,java web项目,linux操作系统myql客户端,三个维度(客户端)的实测。 实测结果是:...

硅谷课堂
48分钟前
0
0
Visual Paradigm 教程[UML]:如何在SoaML中建模多方服务?(下)

下载Visual Paradigm最新试用版 第三部分 - 用UML序列图指定多方编排 在多服务合同中,可以在交互图中显示各方之间的通信和编排。像UML序列图这样的交互图显示了谁调用谁以及何时进行调用。让...

xiaochuachua
56分钟前
1
0
rpm 自动依赖安装

rpm -Uvh *

Mr_Tea伯奕
59分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部