A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天来学习一下共用体union。
共用体可以让不同类型的变量共用同一内存单元,用来节省内存,主要用于嵌入式系统编程、操作系统数据结构或硬件数据结构。

1、共用体可以存储多种类型的变量,但同时只能存储不同类型变量中的一种。
例如:

union data
{
    int i;
    char ch;
    double f;
} ;

可以看到,共用体和结构体格式基本相同。这里共用体data,可以存储int、char、double三种数据类型的变量。

2、不同数据类型的变量共用同一段内存单元,新的成员写入会覆盖旧的成员。
例如:

#include<iostream>  
#include<math.h>
using namespace std;  

int main(void)  
{  
    union data
    {
        int i;
        char ch;
        double f;
    } a;

    a.i = 98;
    cout << "a.ch:" <<  a.ch << endl;
    a.ch = 'a';     
    cout << "a.i :" << a.i << endl;
    system("pause");
}  


结果如下

a.ch:b
a.i :97
请按任意键继续. . .
1
2
3
这里首先给a.i赋值为98,我们可以看到,输出a.ch为b,b的ASCII码为98,也就是说a.ch和a.i对应的是相同的内存单元。然后给a.ch赋值为’a’,输出a.i为97,对应a的ASCII码。

3、共用体的长度等于其最大成员的长度。
例如:

#include<iostream>  
#include<math.h>
using namespace std;  

int main(void)  
{  
    union data
    {
        int i;
        char ch;
        double f;
    } a;

    cout << "sizeof(a.i) = " <<sizeof(a.i) << endl;
    cout << "sizeof(a.ch) = " <<sizeof(a.ch) << endl;
    cout << "sizeof(a.f) = " <<sizeof(a.f) << endl;

    cout << "sizeof(a) = " <<sizeof(a) << endl;

    system("pause");
}  
结果如下:

sizeof(a.i) = 4
sizeof(a.ch) = 1
sizeof(a.f) = 8
sizeof(a) = 8
请按任意键继续. . .

可以看到,为了有足够空间存储三种不同的成员,a的大小等于最大成员f的大小。

4.共用体和结构体可以相互嵌套。
共用体和结构体可以相互嵌套,用法两者是相同的。
例如:

#include<iostream>  
#include<math.h>
using namespace std;  

int main(void)  
{  
    union data
    {
        int i;
        char ch;
        double f;

        struct st
        {
            int st_i;
            double st_f;
        }in;

    }a;

    a.in.st_i = 1;
    cout << "a.in.st_i = " << a.in.st_i <<endl;
    a.in.st_f = 1.2;
    cout << "a.in.st_f = " << a.in.st_f <<endl;
    system("pause");
}  



结果如下:

a.in.st_i = 1
a.in.st_f = 1.2
请按任意键继续. . .


这里有一个匿名用法,将上述例子改为匿名结构体形式:

#include<iostream>  
#include<math.h>
using namespace std;  

int main(void)  
{  
    union data
    {
        int i;
        char ch;
        double f;

        struct //没有名称
        {
            int st_i;
            double st_f;
        };

    }a;

    a.st_i = 1;
    cout << "a.in.st_i = " << a.st_i <<endl;
    a.st_f = 1.2;
    cout << "a.in.st_f = " << a.st_f <<endl;
    system("pause");
}  

6 个回复

倒序浏览
回复 使用道具 举报
棒棒哒
回复 使用道具 举报
牛牛牛!
回复 使用道具 举报
回复 使用道具 举报
优秀,奈斯
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马