C语言基础_共用体

1共用体类型

共用体所占内存空间为所定义的共用体变量中占用空间最大的变量的内存大小。

学习了变量,我们知道,定义一个变量,就是在内存中,分配一块区域来存储变量的数据。例如:

char a;

int b;

此时,定义了char类型的变量a,那么,char类型占据1个字节的存储空间。所以,就在内存中分配1个字节的内存,用来存储变量a的数据。同理,定义了int类型的变量b,那么,int类型占据4个字节的存储空间,所以,就在内存中分配4个字节的内存块,用来存储变量b的数据。

上面定义的变量a和变量b是两个独立的变量,它们的内存空间是分开独立的。

但是,我们能否把变量a和变量b存放在同一个内存空间?就是让它们使用相同的内存空间?如下图:

可以看到,在内存空间中,有0x80001这样的地址。变量a和变量b的数据都存储在0x80001这个地址开始的存储空间中。

那么,在C语言中,提供了“共用体类型”的定义,它可以定义多个变量,使用同一个内存空间。共用体类型的定义如下:

union 共用体类型名

{

成员列表;

};

可以看到,定义共用体类型与定义结构体类型很相似,区别就是:定义结构体类型,使用struct关键字;定义共用体类型,使用union关键字。假设有如下的定义:

union test

{

char a;

int b;

};

此时,就定义了一个共用体类型,名称是test。那么,就可以使用该共用体类型来定义变量,如下:

union test t;

此时,定义了一个共用体类型对象t,对象t有2个成员,分别是char类型的变量a和int类型的变量b。但是,这两个成员使用共同的内存空间。如下图:

可以看到,成员变量a和成员变量b都使用同一块内存空间,所以,给成员变量赋值的时候,就是赋值到共用内存空间中,那么,其它成员变量都可以引用该值。如下是程序测试例子:

可以看到,定义了一个共用体类型union test,然后,使用该共用体类型来定义变量:

union test t;

此时,变量t中的所有成员就使用共同的内存空间。那么,给t.b成员赋值的时候,就是把数据设置到共用体变量t的共用内存块中。当获取t.a成员的数据时,就是从共用内存块中获取。所以,共用体变量的所有成员使用同一块“共用”内存空间。

共用体类型定义和使用

共用体类型的定义和使用与结构体差不多,例如,可以在定义共用体类型的时候,定义变量,如下:

union test

{

char a;

int b;

}x, y, z;

此时,定义了union test共用体类型,同时,定义了共用体类型变量x、y、z。很多时候,我们是把共用体类型的定义和变量定义分开,如下:

union FreqData//定义共用体类型;
{
  float Float;
    u8 Byte[4];
};

union FreqData VcoFreq[2],VcoFreq1,VcoFreq2,MidVcoFreq; //定义共用体变量;

此时,我们先定义了共用体类型unionFreqData,然后,再使用共用体类型来定义变量 VcoFreq[2],VcoFreq1,VcoFreq2,MidVcoFreq。

使用示例:

将数据分割赋值:

                        Module.VcoFreq[0].Byte[0] = Module.MidVcoFreq.Byte[0];
                        Module.VcoFreq[0].Byte[1] = Module.MidVcoFreq.Byte[1];
                        Module.VcoFreq[0].Byte[2] = Module.MidVcoFreq.Byte[2];
                        Module.VcoFreq[0].Byte[3] = Module.MidVcoFreq.Byte[3];

调用float整体使用:
 fVcoConfig(0, Module.VcoFreq[0].Float, Module.Offset[UL_FREQ_OFFSET]);        //vco的更新    

在定义结构体的时候,我们可以省略结构体类型的名称,例如:

struct

{

int i;

char j;

}a, b, c;

此时,定义了 struct 结构体类型,同时,定义了3个结构体变量。那么,由于定义结构体类型的时候,没有给出结构体类型的名称,所以,在代码中,不可以再定义该结构体类型的变量。

同样的道理,对于共用体来说,也可以这样定义,如下:

union

{

char a;

int b;

}x, y, z;

可以看到,在定义共用体的时候,就定义了共用体变量x、y、z;但是,没有给出共用体类型的名称,所以,就不可以再定义该共用体类型的变量。

共用体类型的定义与结构体类型的定义很相似,所以,使用共用体成员变量与结构体成员变量一样,例如:

union test

{

char a;

int b;

}x, y, z;

此时,引用共用体的成员变量如下:

x.a --- 引用共用体变量x的成员变量a;

x.b --- 引用共用体变量x的成员变量b;

z.b --- 引用共用体变量z的成员变量b;

同时,也可以定义共用体类型的指针变量,通过指针来引用成员变量。例如:

union test t;

union test* p; //定义共用体指针变量p;

p = &t; //指针p指向对象t;

p->a; //通过共用体指针变量p来引用其成员变量a;

如下是一个程序测试例子:

可以看到,定义了共用体类型union test,用它来定义了共用体类型变量t和共用类型指针变量p。指针变量p指向变量t。

然后,访问共用体的成员有:

t.a --- 通过共用体变量t,访问成员变量a;

p->a --- 通过共用体指针变量p,访问成员变量a;

可以看到,共用体类型的使用与结构体类型的使用很相似。

定义共用体类型变量的时候,可以对其进行初始化,例如:

union test

{

char a;

int b;

};

union test t = {9};

注意:共用体中的所有成员共同使用一块内存空间,所有,在给其成员进行初始化赋值的时候,只能够有一个数值,在初始化的参数列表中,参数列表只能够有一个数值。所以,有:

union test t = {9};

此时,把数值9存放到共用体变量t的共同使用内存块中。成员变量a和b都是使用该共用的内存空间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值