当前位置:网站首页>C语言基础_共用体
C语言基础_共用体
2022-08-02 08:01:00 【*fzfw】
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都是使用该共用的内存空间。
边栏推荐
- A young man with strong blood and energy actually became a housekeeper. How did he successfully turn around and change careers?
- 【开源项目】X-TRACK源码分析
- 小说里的编程 【连载之二十五】元宇宙里月亮弯弯
- cas:139504-50-0 美登素DM1|Mertansine|
- 【C】关于柔性数组.简要的谈谈柔性数组
- 近期在SLAM建图和定位方面的进展
- 7.联合索引(最左前缀原则)
- 如何将项目部署到服务器上(全套教程)
- I.MX6U-ALPHA开发板(EPIT定时器实验)
- 那些年我们踩过的 Flink 坑系列
猜你喜欢
随机推荐
类和对象【下】
Biotinyl Cystamine|CAS:128915-82-2|生物素半胱胺
传递泛型给JSX元素
高仿【华为消费者业务官网】和精彩动画剖析:练习在低代码平台中嵌入JS代码
redis的安装与应用
3D激光slam:LeGO-LOAM---地面点提取方法及代码分析
prometheus监控mysql_galera集群
牛客2022 暑期多校4 D Jobs (Easy Version)(递推优化策略)
Ansible learning summary (11) - detailed explanation of forks and serial parameters of task parallel execution
The crawler video crawl tools you get
第3周学习:ResNet+ResNeXt
Visual Analysis of DeadLock
按键控制流水灯(计时器)
Write a small game in C (three chess)
WebRTC系列-SDP之编码信息收集
Biotin hydrazide HCl|CAS:66640-86-6|Biotin-hydrazide hydrochloride
暂未找到具体原因但解决了的bug
图扑软件数字孪生油气管道站,搭建油气运输管控平台
MySQL压缩包方式安装,傻瓜式教学
积分商城商品供应商选择的三个要求