`

C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别

阅读更多

共用体(union)

一、 基础概念

有时需要使几种不同类型的变量存放在同一段内存单元中。虽然在同一段内存中不同数据类型所占字节数不同,但都从同一地址开始存放,也就是使用了覆盖技术,几个变量互相覆盖。这种使几个不同的变量共占一段内存的结构,称为共同体类型的结构(也称为联合类型)。

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

union 共用体类型名

 {

     成员表列

};

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

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

也可以在声明共用体类型的同时定义共用体变量,也可以没有共用体类型名直接定义共用体变量。

union data

{

int i;

char ch;

double d;

}a,b,c;

三、 “共用体”与“结构体”区别

结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。

四、 对共用体变量的访问方式

不能直接引用共用体变量,只能引用共用体变量中的成员。

a.i;       a.ch        a.f

不能引用共用体变量:cout<<a;

五、 共用体类型数据的特点

1、   使用共用体变量的目的是希望在同一个内存段存放几种不同类型的数据。注意:在每一瞬时只能存放其中一种,而不是同时存放多种。换句话说,每一瞬时只有一个成员起作用,其他成员不起作用。

2、   能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。因此在引用共用体变量时应注意当前在共用体变量中起作用的是哪个成员。

3、   共同体变量的地址和它的各成员的地址相同,为同一个地址。

4、   不能对共用体变量名赋值;不能引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。

六、共用体应用举例

设有若干个人员的数据,其中有学生和老师。学生的数据中包含:姓名、号码、性别、职业、年级。教师的数据包括:姓名、号码、性别、职业、职务。可以看出,学生和教师所包含的数据是不同的。要求输入人缘的数据,然后再输出。(一个学生一个教师)。

程序如下:

 

/*

 * test4.cpp

 *

 *  Created on: 2012-4-10

 *      Author: David

 */

 

#include <iostream>

#include <string>

#include <iomanip>  //因为在输出流中使用了控制符setw

using namespace std;

struct                //声明匿名的结构体

{

int num;

char name[10];

char sex;

char job;

union P              //声明共用体类型

{

int grade;       //年级

char position[10]; //职务

}category;       //成员category为共用体变量

}person[2];         //定义共用体数组person,含两个元素(个人认为就是结构体类型变量)

 

int main()

{

int i ;

for(i=0;i<2;i++)

{

cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;

if(person[i].job=="s")

{

cin>>perosn[i].category.position;

}else if(person[i].job=="t")

{

cin>>person[i].category.position;

}

cout<<endl<<"No.Name sex job grade/position"<<endl;

}

 

for(i=0;i<2;i++)

{

if(person[i].job=="s")

{

cout<<person[i].num<<setw(6)<<person[i].name<<""<<perosn[i].sex<<""<<person[i].job<<setw(10)<<perosn[i].category.grade<<endl;

}else{

cout<<perosn[i].num<<setw(6)<<person[i].name<<""<<person[i].sex<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;

}

}

return 0;

}


分享到:
评论

相关推荐

    深入了解C++ 结构体(struct)与共用体(union)

    结构体(struct)与共用体(union)是C语言中就已经存在的数据类型,C++对他们进行了扩充,最大的变化是允许在结构和公用体中定义成员函数。下面将通过实例讲解二者的特性和用法。 1.struct 以下是一个使用了结构体...

    结构体和共用体sruct union typedef

    讲述了 结构体 共用体 struct link 枚举 typedef

    C语言 共用体(Union)详解及示例代码

    在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: union 共用体名{  成员列表 }; 共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。 结构体和共用体的...

    共用体union的妙用

    结构体struct是一个常用的数据类型,主要是将各种类型的数据打包成一个新的数据类型,在驱动开发,寄存器的定义等方面都有比较大的优势。在使用的过程中需要注意空结构体的大小以及对齐(8字节)对数据大小的影响。...

    C语言程序设计题库 第八章:结构体、共用体和枚举类型

    结构体可由多中数据类型的元素组成(将不同的数据类型组合成为一个整体),比如描述一个学生信息,学生的学号使用long int类型存储、年龄用int类型存储、姓名用字符串(字符数组)存储。如果是一个学生,可以只需声明3个...

    C++结构体实例和类实例的初始化

    结构体实例(包括共用体)和类实例的初始化方法完全相同,二者都可以应用于继承层次中。不同点是结构体(包括共用体)默认成员为public,而类默认成员是private型的。  一、若类和结构体所有数据成员均为public型...

    c语言课后习题

    该共用体变量中占用最大存储空间的成员所需存储空间 D. 该共用体变量中所有成员所需存储空间的总和 【答】C (6)以下关于枚举的叙述不正确的是 。 A. 枚举变量只能取对应枚举类型的枚举元素表中元素 B. 可以在定义...

    C语言自定义类型—–位段,枚举,联合(共用体)

    这里我们声明了一个位段类型A,与结构体不同的是,每个成员后面都有一个冒号且都跟一个数字,其含义是该成员占用几个比特位。 位段的内存分配 位段的成员可以是int 、unsigned int、signed int、或者是char(属于...

    c++教案(清华版)(2)

    共用体类型(union) 类类型(class) 指针类型 type * 引用类型 type & 布尔型就是逻辑型,空类型就是无值型。 2.2 常量 2.2.1 常量 常量(字面常量或直接常量) -----其值不能改变的量称为常量。 ...

    实验14结构与联合

    (4)掌握共用体的概念与使用。 3.实验设备 PC计算机,配置Win7操作系统,Word2010,Eclipse+minGW 4.实验原理 (1)结构体 C 语言提供了一种如果用简单变量来分别代表属性,难以反映出他们之间的内在联系数据类型...

    C语言中的所有关键字

    (1) char :声明字符型变量或函数 ...(10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

    C语言程序设计实验报告——实验.doc

    掌握结构变量与指向结构的指针作为函数参数实现函数的调用。 " " "6.掌握共用体的概念和说明方法。 " " "7.掌握共用体变量的定义和引用。共用体类型变量成员的使用 " " "8.掌握位运算的概念和方法。 " " "9.掌握位...

    用typedef定义类型详细总结

    除了可以直接使用C提供的标准类型名(如:int ,char ,float,double,long等)和自己声明的结构体、共用体、枚举类型外,还可以使用typedef声明 新的类型名 来代替 已有的 类型名。如: typedef int INTEGER; typedef ...

    socket linux2

    //定义子进程共用的共享内存 shmid = shmget(MYKEY, SIZE, IPC_CREAT | 0600);//创建共享内存 shmaddr= (char *) shmat(shmid, 0, 0);//通过共享内存ID获取共享内存起始地址 if(shmid==-1)//创建失败 { ...

Global site tag (gtag.js) - Google Analytics