C++共用体的介绍

有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中(见图7.12)。

图7.12

以上3个变量在内存中占的字节数不同,但都从同一地址开始存放。也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占同一段内存的结构,称为共用体(union )类型的结构(有些书译为联合)。

声明共用体类型的一般形式为:

union 共用体类型名{成员表列};

定义共用体变量的一般形式为:

共用体类型名 共用体变量名;

当然也可在声明共用体类型的同时定义共用体变量,也可没有共用体类型名而直接定义共用体变量。例如可以看到,“共用体”与“结构体”的定义形式相似。但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。

共用体变量的访问方式

不能引用共用体变量,而只能引用共用体变量中的成员。例如,下面的引用方式是正确的:

a.i  (引用共用体变量中的整型成员i)

a.ch  (引用共用体变量中的字符型成员ch)

a.f  (引用共用体变量中的双精度型成员d)

不能只引用共用体变量,例如

cout<<a;

是错误的,应该写成

cout<<a.i;

cout<<a.ch;

等。

共用体类型数据的特点

  1. 使用共用体变量的目的是希望用同一个内存段存放几种不同类型的数据。但请注意: 在每一瞬时只能存放其中一种,而不是同时存放几种。
  2. 能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
  3. 共用体变量的地址和它的各成员的地址都是同一地址。
  4. 不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。

【例7.7】设有若干个人员的数据,其中有学生和教师。学生的数据中包括: 姓名、号码、性别、职业、年级。教师的数据包括: 姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。

现要求把它们放在同一表格中,如果job项为s(学生),则第5项为grade(年级)。即Li是3年级的。如果job项是t(教师),则第5项为position(职务)。Wang是prof(教授)。显然对第5项可以用共用体来处理(将class和position放在同一段内存中)。要求输入人员的数据,然后再输出。为简化起见,只设两个人(一个学生、一个教师)。

程序如下:

  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>//因为在输出流中使用了控制符setw
  4. using namespace std;
  5. struct
  6. {
  7. int num;
  8. char name[10];
  9. char sex;
  10. char job;
  11. union P //声明共用体类型
  12. {
  13. int grade; //年级
  14. char position[10]; //职务
  15. }category; //成员category 为共用体变量
  16. }person[2]; //定义共用体数组person,含两个元素
  17. int main( )
  18. {
  19. int i;
  20. for(i=0;i<2;i++) //输入两个学生的数据
  21. {
  22. cin>>person[i].num>>person[i].name
  23. >>person[i].sex>>person[i].job;
  24. if(person[i].job==‘s‘)
  25. cin>>person[i].category.grade; //若是学生则输入年级
  26. else
  27. if (person[i].job==‘t‘)
  28. cin>>person[i].category.position; //若是教师则输入职务
  29. }
  30. cout<<endl<<"No. Name sex job grade/position"<<endl;
  31. for(i=0;i<2;i++)
  32. {
  33. if (person[i].job==‘s‘) cout<<person[i].num<<setw(6)
  34. <<person[i].name<<" "<<person[i].sex <<" "
  35. <<person[i].job<<setw(10)<<person[i].category.grade<<endl;
  36. else cout<<person[i].num<<setw(6)<<person[i].name
  37. <<" "<<person[i].sex <<" "<<person[i].job
  38. <<setw(10)<<person[i].category.position<<endl;
  39. }
  40. return 0;
  41. }

运行情况如下:

101 Li fs 3 (注意在输入的字母f和s之间无空格)

102 Wang mt prof (注意在输入的字母m和t之间无空格)

No. Name sex job grade/position 101 Li f s 3 102 Wang m t prof

为了使输出结果上下对齐,在cout语句中用了setw控制符和插入空格。往往需要试验多次。

时间: 2024-08-03 16:32:20

C++共用体的介绍的相关文章

结构体、共用体和用户定义类型(1)

C语言的基本类型有:整型(int).字符型(char).浮点型(float).双精度型(double).空值型(void)以及派生类型 (指针和数组).本章介绍C语言中可由用户构造的三种数据类型: (1)用户定义类型(typedef):(2)结构体(struct):(3)共用体(union): 1 用typedef说明新类型名 C语言允许用 typedef 说明一种新类型名,一般形式为: typedef 类型名 标识符: “类型名”必须是在此语句前已有定义的类型标识符.“标识符”是一个用户定义标

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

结构体、共用体和位运算

1.C语言结构体的定义和使用 在实际问题中,一组数据往往具有不同的数据类型:例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型.因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.定义结构体的一般形式为: struct 结构体名{ 成员列表 }; 每个成员都是结构体的组成部分,有名字,也有数据类型,形式为: 类型说明符 成员名; 例如用结构体来表示学生信息: struct stu{ c

c的详细学习(10)结构体与共用体的学习(二)

在c语言中,结构体数据类型与共用体数据类型都属于构造类型.共用体与结构体数据类型在定义上十分相似,但它们在存储空间的占用分配上有本质的区别.结构体变量是各种类型数据的集合,各成员占据不同的存储空间,而共用体变量的所有成员占用相同的存储空间,在某一时刻只有一个成员起作用. (1)共用体类型的定义 定义共用体类型的一般形式: union 共用体类型名 { 数据类型  成员名1; 数据类型  成员名2; 数据类型  成员名3; ...... }; 以上定义了一个名为data的共用体类型.它说明该类型由

C语言共用体的作用

一.介绍 1.共用体(Union),它的定义格式为: union 共用体名{     成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意. 2.结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响:而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员. 结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存.共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如

C语言:结构体,共用体

结构体: 一个变量,存储不同类型的数据项共用体:一个变量,存储不同类型的数据项,相同的内存位置,存储不同的数据类型 #include <stdio.h> #include <string.h> struct Books { char title[50]; char author[20]; }; union Data { char title[50]; char author[20]; }; main() { union Data _u; struct Books _s; print

C语言之共用体

1:共用体(union)类型的定义 union myunion { int a; char b; }; int main(void) { myunion u1; u1.a = 23; printf("u1.b = %d\n", u1.b);     //23 printf("&u1.a = %p \n",&(u1.a));  //&u1.a = 0xbfbe5c04 printf("&u1.b = %p \n",&

[C++] Union共用体示例讲解

/* * UnionLab.cpp * * Created on: Nov 29, 2014 * Author: sodino */ #include <iostream> using namespace std; /** * "共用体"是一种特殊的类,在一个"共用体"内可以定义多种不同的数据类型. * 一个被声明为该"共用体"类型的变量中,允许装入该"共用体"所定义的任何一种类型的数据, * 这些不同类型的数据共

结构体、共用体、枚举____笔记

-------------------讲在前面 老规矩,本人小菜. 互联网是发达的,神奇的.其中,有开源与不开源一说,我不知道我懂多少. 我在网上取我所需,但是有时候会标注来源,有时候没标注.如果某大神觉得被冒犯了,请联系删除. 我会有复制粘贴,但我并不认为拿过来就是我的东西,只是纯粹的欣赏,学习. 开博客,主要是觉得对自己学习有益.我会记录自己觉得有意义的东东. 如果有人见到本文章,是我的荣幸,希望对你有所帮助. 当然,我不保证绝对正确,若你发现不对的地方,可以评论或者联系,指正批评,大家相互