c语言的union和struct


什么是union(联合体)?

union(联合体):union是一个能在同一个存储空间(但不同时)存储不同类型数据的数据类型。
例如:

union test1
{
    char a;
    int b;
    short c;
};

结构体(struct):是由一系列具有相同类型或不同类型的数据构成的数据集合
例如:

struct test2
{
    char aa;
    int bb;
    short cc;
};

那么计算下面得输出

#include<iostream>
using namespace std;
union test1
{
    char a;
    int b;
    short c;
};
struct test2
{
    char aa;
    int bb;
    short cc;
};
int main()
{
    cout << "sizeof union test1 is " << sizeof(test1) << endl;
    cout << "sizeof struct test2 is " << sizeof(test2) << endl;
    system("pause");
    return 0;
}

输出是

sizeof union test1 is 4
sizeof struct test2 is 12
请按任意键继续. . .

为什么?

struct好理解,内存为各个成员变量所占内存的和(要注意数据对齐)
union呢?先看定义

union(联合体):union是一个能在同一个存储空间(但不同时)存储不同类型数据的数据类型。

不同时就是说在一个时刻union只能有一种数据类型,例如test1 同一时刻,只能是char ,int 或者
short

可以理解为:一个厕所一个时刻只能有一个人用(胖子或者瘦子或者其他)
但又要能都装的下,所以union的内存长度(厕所大小)就是成员变量中内存长度最长(最胖的那个人)的长度(也要考虑对齐)


理解了union之后要怎么使用他呢?

在使用union的时候,我们还需要注意以下的几点:

1.同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。

2.共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:

#include <iostream>
using namespace std;

union test
{
     char mark;
     long num;
     float score;
}a;

int main()
{
     // cout<<a<<endl; // wrong
     a.mark = 'b';
     cout<<a.mark<<endl; // 输出'b'
     cout<<a.num<<endl; // 98 字符'b'的ACSII值
     cout<<a.score<<endl; // 输出错误值

     a.num = 10;
     cout<<a.mark<<endl; // 输出空
     cout<<a.num<<endl; // 输出10
     cout<<a.score<<endl; // 输出错误值

     a.score = 10.0;
     cout<<a.mark<<endl; // 输出空
     cout<<a.num<<endl; // 输出错误值
     cout<<a.score<<endl; // 输出10

     return 0;
}

所以,在使用union的时候,要十二分的小心的。

3.由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。

4.不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。

5.union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值