【C语言资料更新】共用体联合体

馋奶兔 提交于 2021-02-12 18:12:38

文/Edward


共用体又称为联合体,它是C语言中的一种特殊的数据类型。它允许用户在相同的内存位置存储不同的数据类型。用户可以定义一个带有多成员的共用体,但是任何时候这些成员都共享同一块内存。举个例子,共用体的存储就好像是小孩子玩的太空沙,一块太空沙它的大小是固定的,有且只有这么多,而共用体内部的存储就好像一个又一个模具,你可以将这块太空沙分成两块放置到两个小一点的小熊模具里面,它就变成了两只小熊,也可以将它放到一块大一点的老虎模具里面,它就变成了一只老虎。因此,共用体的本质就是同一块内存的不同形式的访问。
为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union 共用体标签(可缺省)
{
      数据类型 成员变量1;
      数据类型 成员变量2;
      ……;
} 共用体变量1,共用体变量2……;
我们可以发现,其实共用体定义时候的形式和结构体如出一辙,只不过定义的关键词不一样。在定义时,共用体标签可以省略,联合体内部的成员变量数据类型是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义,当然也可以是结构体。
下面我们定义一个名为 Data 的共用体类型,它有三个成员 i、f 和 str,定义如下:
union Data
{
   int i;
   float f;
   char  str[20];
} data;
现在,这个Data 类型的共用体可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。Data共用体的内存分别如图1所示。
图1 共用体内存存储
共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。
共用体内部的成员变量访问和结构体一样,用“共用体.成员名”即可。
下面的实例将显示上面的共用体占用的总内存大小,程序设计的思路为,我们去定义一个共用体,在里面存入不同的长度的变量,最后用sizeof去测量共用体,看看最后程序的输出,具体代码如图2所示。
图2 测量共用体内存大小
共用体说到底还是同一块内存空间的不同形式访问,你可以将这块内存以int类型去访问,也可以将这块内存以char数组的类型去访问。我们可以通过一个例子来说明上述的论点。论证的过程很简单,我们先定义一个共用体,在这个结构体里面定义两个变量,一个为“unsignedint”类型,一个为“char”类型数组。接着给unsigned int的变量赋值,最后将这两个变量都打印出来。如图3所示。
图3 共用体同一块内存的不同形式访问
我们之前说过,数组定义时,其内部的元素地址都是向上增长的,因此我们对共同体中的数组赋值后,再用一个四字节的无符号整形变量去访问,就可以得到组合到一起的数值了。
一般来说,小端模式(高字节存储到高地址)的计算机会将高位地址的数组元素放在4字节无符号整数的高字节,低地址的数组元素,放在4字节无符号整数的低字节。大端模式(高字节存储到低地址)相反。利用这个原理,我们就可以判断计算机存储的大小端了。



本文分享自微信公众号 - 乐创客(jctdiy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!