首页 > 编程知识 正文

共用体的作用,举例说明共用体的用途?

时间:2023-05-04 12:07:00 阅读:272479 作者:1782

共用体详解 1.含义2.一般类型3.关键知识点3.13.23.33.43.53.63.73.83.9 4.总结

1.含义

在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

2.一般类型

定义共用体类型变量的一般形式为:

union 共用体名{ 成员表列}变量表列; 3.关键知识点

例如:

union Data
{
int i; //表示不同类型的变量i,ch,f可以存放到同一段存储单元中
char ch;
float f;
}a, b, c; //变量

在地址空间中表示如下图:

以上3个变量在内存中占的字节数不同,但都是从同一地址开始(图中设为1000)存放,也就是使用覆盖技术,后一个数据覆盖了前面的数据。
共用体类型数据的特点:

3.1

(1)同一内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一个成员,而不是同时存放几个。

union Data{int i; //表示不同类型的变量i,ch,f可以存放到同一段存储单元中char ch;float f;}a, b, c; //变量a.i = 97;

表示将整数97存放在共用体变量中,输出结果如下。

97换成16进制为0x00000061,又因为电脑的存储方式为小端格式,所以在地址中存在的方式如下图

因为float的存储方式不同,解码时会按照独自的方式计算解码(可自行搜索float类型数据在内存中的存储方式),所以输出为0.00000。

当a.f = 0x61;时,输出入下图:(打印a.ch时,因为0x0不能用字符打印,所以用的整型,效果一样)

存储方式为:

所以float类型97存储的十六进制为0x42C20000。

3.2

(2)可以对共用体变量初始化,但初始化表中只能有一个常量。

union Data{ int i; //表示不同类型的变量i,ch,f可以存放到同一段存储单元中 char ch; float f;}a = {1,'a',1.5}; //不能初始化3个成员,他们占用同一段存储单元union Data a = {16}; //正确,对第一个成员初始化union Data a = {.ch = 'j'}; //C99允许对指定的一个成员初始化 3.3

(3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共同体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。

3.4

(4)共用体变量的地址和它的个成员的地址都是同一个地址。例如:&a.i,&a.ch,&a.f都是同一值。

3.5

(5)共用体类型可以出现结构体类型定义中,也可以定义共用体数组。结构体中也可以出现在共用体类型定义中,数组也可以作为共用体成员。

3.6

共用体变量不能直接引用。

3.7

改变共用体中的一个成员,就会改变整个共用体。

3.8

共用体在任意一个时刻,只有一个成员有意义。并且,对共用体变量赋值,在任意一个时刻只能对一个变量赋值。

3.9

共用体的大小就是最宽基本成员大小,但是要整除最宽基本成员大小。
这一个小点十分重要,而且十分容易出错。
例如:

大家先看下这个结果是多少?
是13吗?
共用体的大小就是最宽基本成员大小,这句话是不完整的,后面还有一句,那就是要整除最宽基本数据类型。

答案是16.

4.总结

共用体其实相对于结构体来说是很简单的,你可以把共用体想象成一个多面手,定义一个共用体变量,它可以用于多种用途,时而是整型,时而是浮点型数据。给人一种高深莫测的感觉,但是,要小心,一旦你对某个成员进行了修改,那么整个共用体都会收到影响。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。