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

 更新时间:2013年08月31日 11:09:54   作者:  
共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量

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

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

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

复制代码 代码如下:

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;
}


您可能感兴趣的文章:

相关文章

  • C语言实现文件内容的加密与解密

    C语言实现文件内容的加密与解密

    文件内容需要加密与解密功能的原因主要有两个方面:保护数据安全和确保数据完整性,所以接下来小编就给大家介绍一下如何通过C语言实现文件内容加密与解密,需要的朋友可以参考下
    2023-08-08
  • C语言实现数字连连看

    C语言实现数字连连看

    这篇文章主要为大家详细介绍了C语言实现数字连连看游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++常用的11种设计模式解释及示例代码详解

    C++常用的11种设计模式解释及示例代码详解

    c++常用的设计模式包括单例模式、工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、观察者模式和命令模式等,这篇文章主要介绍了C++常用的11种设计模式解释及示例,需要的朋友可以参考下
    2023-02-02
  • C++实现连连看消除算法

    C++实现连连看消除算法

    这篇文章主要为大家详细介绍了C++实现连连看消除算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Qt项目打包的实现步骤

    Qt项目打包的实现步骤

    本文主要介绍了Qt项目打包的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 如何实现socket网络编程的多线程

    如何实现socket网络编程的多线程

    首先,学好计算机网络知识真的很重要。虽然,学不好不会影响理解下面这个关于宏观讲解,但是,学好了可以自己打渔吃,学不好就只能知道眼前有鱼吃却打不到渔。在Java中网络程序有2种协议:TCP和UDP,下面可以和小编一起学习下
    2019-05-05
  • 深入理解C++内链接与外链接的意义

    深入理解C++内链接与外链接的意义

    链接描述了名称在整个程序或一个翻译单元中如何引用或不引用同一实体,下面这篇文章主要给大家介绍了关于C++内链接与外链接意义的理解,需要的朋友可以参考下
    2021-11-11
  • 一波二叉树遍历问题的C++解答实例分享

    一波二叉树遍历问题的C++解答实例分享

    这篇文章主要介绍了一波二叉树遍历问题的C++解答实例分享,包括节点打印和转换为镜像等问题的解答,需要的朋友可以参考下
    2016-02-02
  • C++从序列容器中删除元素的四种方法

    C++从序列容器中删除元素的四种方法

    删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector 和 string 是最常用的,但这里也会介绍 deque 和 list 以供全面了解,尽管在一般情况下可能不会使用它们,本文将详细给大家介绍一下C++从序列容器中删除元素的四种方法,需要的朋友可以参考下
    2025-03-03
  • C++实现单链表按k值重新排序的方法

    C++实现单链表按k值重新排序的方法

    这篇文章主要介绍了C++实现单链表按k值重新排序的方法,结合实例形式分析了C++单链表中按照给定值进行判断与排序的相关操作技巧,需要的朋友可以参考下
    2017-05-05

最新评论