C++中共用体的定义与应用总结_C 语言

定义:
使用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占同一段内存的结构,成为共同体类型的结构。

共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量。

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

复制代码 代码如下:

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

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

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

例如:

复制代码 代码如下:

union data{
int        i;
char   ch;
double d;
};
data a,b,c;

或者

复制代码 代码如下:

union{
int        i;
char   ch;
double d;
};
data a,b,c;

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

共用体的使用
1.不能应用共用体变量,而只能引用共用体变量中的成员。

例如:

复制代码 代码如下:

cout<<a.i;
cout<<a.ch;

2.使用共用体变量的目的是希望通过统一内存段存放几种不同类型的数据。

但是要注意,每一瞬间只能存放一种,而不是存放集中。并且,如果对新的成员变量的话,原来的成员变量的值就被覆盖了。

复制代码 代码如下:

#include<iostream>
using namespace std;
int main(){
   union data{
    char a;
    char b;
   };
   data qianshou;
   qianshou.a='q';
   cout<<qianshou.a<<endl;
   qianshou.b='m';
   cout<<qianshou.a<<endl;
   return 0;
}


后来,我们对共用体中的成员b进行了赋值,结果我们输出的是成员a,输出的是b的值,所以证明它们是公用地址的。

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

一个共同体的实例:
设有若干个人员的数据,其中有学生和老师。学生的数据包括:姓名,编号,性别,职业,年级。老师的数据包括:姓名,编号,性别,职业,职务。可以看出,学生和老师所包含的数据是不同的。先要求把他们放在同一个表格中:

要求设计程序输入人员信息然后输出。

如果把每个人都看作一个结构体变量的话,可以看出老师和学生的前4个成员变量是一样的,并且第五个成员变量可能是class或者position,当第四个成员变量是s的时候,第五个成员变量就是class;当第四个成员变量是t的时候,第五个成员变量就是position。

复制代码 代码如下:

#include<iostream>
#include<string>
using namespace std;
int main(){
   struct{
      string name;
      string num;
      char   sex;
      char   job;
      union{
       char grade[5];
       char position[5];
      }p;//定义了一个共同体变量
    }person[2];//定义了一个结构体数组变量
   int i=0;
   cout<<"name\tnum\tsex\tjob\tclass/position"<<endl;
   for(;i<2;i++){
 cin>>person[i].name>>person[i].num>>person[i].sex>>person[i].job;
 if(person[i].job=='s')cin>>person[i].p.grade;
 else cin>>person[i].p.position;   
   }
   i=0;
   cout<<"===========show data==========="<<endl;
   for(;i<2;i++){
    cout<<person[i].name<<"\t";
    cout<<person[i].num<<"\t";
    cout<<person[i].sex<<"\t";
    cout<<person[i].job<<"\t";
    if(person[i].job=='s')cout<<person[i].p.grade<<endl;
 else cout<<person[i].p.position<<endl;            
   }
   cout<<endl;
   return 0;
}

时间: 2024-09-15 04:41:40

C++中共用体的定义与应用总结_C 语言的相关文章

详解C语言中结构体的自引用和相互引用_C 语言

结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针. 结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针.1. 自引用 结构体 1.1 不使用typedef时错误的方式: struct tag_1{ struct tag_1 A; /* 结构体 */ int value; };         这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去

C/C++语言中结构体的内存分配小例子_C 语言

当未用 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度对齐:当使用了 #pragma 指令指定编译器的对齐位数时,结构体按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐. #pragma 指令格式如下所示:#pragma pack(4)     // 或者 #pragma pack(push, 4) 举例如下:(机器字长为 32 位)    struct    {        char a;    }test;    printf("%d

cursor-PL/SQL中什么变量必须定义?它属于强类型语言还是弱类型语言

问题描述 PL/SQL中什么变量必须定义?它属于强类型语言还是弱类型语言 declare begin for i in 0..5 loop for k in 1..i loop dbms_output.put(' '); end loop; for j in 1..11-2*i loop dbms_output.put('*'); end loop; dbms_output.put_line(''); end loop; end; i,j,k都不必先申明再使用 declare pename em

共用体的定义与应用详细解析_C 语言

定义:使用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占同一段内存的结构,成为共同体类型的结构. 共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量. 声明共用体的一般形式为: 复制代码 代码如下: union 共用体类型名{    成员列表}; 定义共用体变量的一般形式为:共用体类型名   共用体变量名;例如: 复制代码 代码如下: union data{int        i;char   ch;double d; }

解决C++中重定义的方法总结_C 语言

C++由于头文件重复包含了所定义的变量或者常量,编译器就会报重复定义的错误.如果你碰见这样的问题可以考虑重下面几个方面去解决: 1.在出现重定义错误的头文件加上:#ifndef FileName_H_#define FileName_H_ ....(头文件内容)#endif注意如果FileName_H_这个名字已经被使用,将会出现未定义问题(这里不讨论),这是你保证FileName_H_唯一就可以. 2.在出现重定义错误的头文件加上这一句:#pragma once 就可以解决(VS建立的类都会默

关于C/C++中typedef的定义与用法总结_C 语言

在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多.typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析. 基本定义: typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef目的

用typedef定义类型详细总结_C 语言

除了可以直接使用C提供的标准类型名(如:int ,char ,float,double,long等)和自己声明的结构体.共用体.枚举类型外,还可以使用typedef声明 新的类型名 来代替 已有的 类型名.如: typedef int INTEGER; typedef float REAL; 指定用INTEGER代表int类型,REAL代表float类型,这样,下面的两行等价: 1)int i,j;  float a,b; 2)INTEGER i,j;   REAL a,b; 可以声明结构体类型

C++中的类模板详解及示例_C 语言

C++中的函数模板 对于类的声明来说,也有同样的问题.有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: 复制代码 代码如下: class Compare_int{ public:  Compare(int a,int b)  {   x=a;   y=b;  }   int max()  {   return (x>y)?x:y;  }  int min()  {   return (x<y)?x:y;  } private:  int x,y;}; 其作用是

解析C++中的5个存储类的作用_C 语言

存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C++ 程序中可用的存储类: auto register static extern mutable 存储类说明符可以分为两个存储类:自动存储类(autmatic storage class)和静态存储类(static storage class).关键字auto和regtster用来声明自动存储类变量.这种变量在进入声明的块时生成,在块活动期间存在,在退出这个块时删除. 只有变量能作