“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。如前面介绍的“单位”变量, 如定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符串(教研室)。要么赋予整型值,要么赋予字符串,不能把两者同时赋予它。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后, 才能把变量说明为该联合类型。

  一、联合的定义

  定义一个联合类型的一般形式为:

union 联合名
{
 成员表
};

  成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 成员名的命名应符合标识符的规定。

  例如:

union perdata
{
 int class;
 char office[10];
};

  定义了一个名为perdata的联合类型,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。联合定义之后,即可进行联合变量说明,被说明为perdata类型的变量,可以存放整型量class或存放字符数组office。

  二、联合变量的说明

  联合变量的说明和结构变量的说明方式相同, 也有三种形式。即先定义,再说明;定义同时说明和直接说明。以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类型。 它们的内存分配示意图如图7—8所示。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。从图中可见,a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。

  联合变量的赋值和使用

  对联合变量的赋值,使用都只能是对变量的成员进行。 联合变量的成员表示为: 联合变量名.成员名 例如,a被说明为perdata类型的变量之后,可使用 a.class a.office 不允许只用联合变量名作赋值或其它操作。 也不允许对联合变量作初始化赋值,赋值只能在程序中进行。还要再强调说明的是,一个联合变量, 每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合变员的某一个成员值。

  [例7.15]设有一个教师与学生通用的表格,教师数据有姓名,年龄,职业,教研室四项。学生有姓名,年龄,职业,班级四项。

  编程输入人员数据, 再以表格输出。

main()
{
 struct
 {
  char name[10];
  int age;
  char job;
  union
  {
   int class;
   char office[10];
  } depa;
 }body[2];
 int n,i;
 for(i=0;i<2;i++)
 {
  printf("input name,age,job and department/n");
  scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
  if(body[i].job=='s')
   scanf("%d",&body[i].depa.class);
  else
   scanf("%s",body[i].depa.office);
 }
 printf("name/tage job class/office/n");
 for(i=0;i<2;i++)
 {
  if(body[i].job=='s')
   printf("%s/t%3d %3c %d/n",body[i].name,body[i].age,body[i].job,body[i].depa.class);
  else
   printf("%s/t%3d %3c %s/n",body[i].name,body[i].age,
   body[i].job,body[i].depa.office);
 }
}

  本例程序用一个结构数组body来存放人员数据, 该结构共有四个成员。其中成员项depa是一个联合类型, 这个联合又由两个成员组成,一个为整型量class,一个为字符数组office。在程序的第一个for语句中,输入人员的各项数据,先输入结构的前三个成员name,age和job,然后判别job成员项,如为"s"则对联合depa·class输入(对学生赋班级编号)否则对depa·office输入(对教师赋教研组名)。

  在用scanf语句输入时要注意,凡为数组类型的成员,无论是结构成员还是联合成员,在该项前不能再加"&"运算符。如程序第18行中
body[i].name是一个数组类型,第22行中的body[i].depa.office也是数组类型,因此在这两项之间不能加"&"运算符。程序中的第二个for语句用于输出各成员项的值。

C语言程序设计基础之联合相关推荐

  1. 对c语言和程序设计基础的体会,C语言程序设计基础与应用

    <C语言程序设计基础与应用(高等院校计算机教育系列教材)>由刘丽.朱俊东.张航编著,本书内容由浅入深.循序渐进,介绍C语言的基本语法知识和程序设计等内容,同时兼顾了全国计算机等级考试二级C ...

  2. Franklin C-51语言程序设计基础

    Franklin C-51语言程序设计基础 1.1 Franklin C-51数据类型 Franklin C-51编译器支持下列数据类型: 数据类型 长度 值域 bit 1 字节 0 或 1 sign ...

  3. 陈东方 c语言程序设计基础实验与题解(答案),C语言程序设计基础实验与题解 黄远林 陈东方 李顺新...

    商品描述: 注意啦:旧书库存不准确经常断货,为保证您的利益,拍前请务必联系卖家咨询库存情况.     对于未事前进行咨询直接付款的买家,本店有权拒绝发货.请知悉    !                ...

  4. c语言程序设教材计 乌云高娃,C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt...

    C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt 主要内容 课程概述 为什么选择C语言作为入门课程? C语言 ...

  5. 周信东c语言实验二实验报告,周信东主编最新版C语言程序设计基础实验一实验报告.doc...

    周信东主编最新版C语言程序设计基础实验一实验报告.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我 ...

  6. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...

    01程序设计基础实验报告_C语言程序设计基础 程序设计基础 实验报告 题 目: C语言程序设计基础 院 (部): 管理工程学院 专 业: 信息管理与信息系统 班 级: 信管101 姓 名: 张三 学 ...

  7. java语言仅支持单重继承_java语言程序设计基础篇习题_复习题_第十一章

    java语言程序设计基础篇习题_复习题_第十一章 11.1 下面说法是真是假?一个子类是父类的子集. 11.2 使用什么关键字来定义一个子类 11.3 什么是单一继承?什么是多重继承?java支持多重 ...

  8. 《C语言程序设计基础》第2章作业,清华大学出版社-图书详情-《C语言程序设计基础实验与题解》...

    C语言是国内外广泛使用的一种程序设计语言,也是初学程序设计人员的首选入门程序设计语言.C语言具有表达能力强.代码质量高和可移植性好等特点,既具有高级语言的特点,又具有汇编语言的优点,越来越受到人们的欢 ...

  9. python语言程序设计2019版第二章课后答案-python语言程序设计基础课后答案第二章...

    python语言程序设计基础课后答案第二章 以下合法的用户自定义标识符是____________. 导入模块或者模块中的元素要使用关键字________ . 下列哪个函数是用来控制画笔的尺寸的____ ...

最新文章

  1. Activiti 6.x【11】IntermediateEvent
  2. Windows的cmd ping不通vmware的linux系统ip
  3. Service Mesh 在中国工商银行的探索与实践
  4. mysql获取最好成绩对应数据的其他项_开源数据同步神器——canal
  5. 大数据,AI, Python,编程,数学,英语,恋爱资料大全
  6. 【maven】Mac的仓库拷贝到Windows的离线环境下无法引入问题
  7. JavaScript学习(九十)—数组练习题(2)
  8. Joe Hocking - Unity in Action. 2nd Ed [2018]
  9. 串行卧重建19:大对象的演变
  10. Eclipse2020+Tomcat9.0+Maven Web配置!
  11. 网易云音乐云盘上传歌词的方法
  12. 腾讯恢复微信个人号注册
  13. Python 在Windows上终止子过程(subprocess)
  14. 微信公众号页面中监听手机“返回”,并回到公众号里
  15. 西安交通大学护理学计算机考试,西安交通大学护理专业怎么样
  16. 值得学习17个C/C++ 超经典开源项目
  17. 第7章 使用RAID与LVM磁盘阵列技术
  18. 全球及中国足病鞋垫行业销售情况及营销渠道策略报告(2022-2027年)
  19. 论文翻译-ASTER: An Attentional Scene Text Recognizer with Flexible Rectification
  20. windows rid劫持

热门文章

  1. B端运营的核心技能,学会了还怕做不好业务吗?
  2. 一句话证明你是产品经理
  3. 解构产品经理的技术思维
  4. 从0到1打造企业数字化运营闭环白皮书
  5. 产品经理必备的两种心态
  6. django中的Ajax文件上传
  7. 工信部推动云计算健康快速发展 催生巨大市场机会
  8. Storm概念学习系列之Topology拓扑
  9. Hadoop学习笔记(七)
  10. [Selenium] 操作新弹出窗口之验证标题和内容