您当前的位置:首页 > 互联网教程

c语言中的共用体是什么

发布时间:2025-05-13 15:10:15    发布人:远客网络

c语言中的共用体是什么

一、c语言中的共用体是什么

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:\x0d\x0aunion共用体名\x0d\x0a{成员表列};\x0d\x0a\x0d\x0aunion data\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adoublec;\x0d\x0achard;\x0d\x0a}obj;\x0d\x0a该形式定义了一个共用体数据类型union data,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。\x0d\x0a\x0d\x0aunion data/*共用体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0astruct stud/*结构体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a};\x0d\x0amain()\x0d\x0a{\x0d\x0astruct stud student;\x0d\x0aprintf("%d,%d",sizeof(struct stud),sizeof(union data));\x0d\x0a}\x0d\x0a运行程序输出:\x0d\x0a15,8\x0d\x0a程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。 \x0d\x0a对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。\x0d\x0a\x0d\x0a可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:\x0d\x0aunion data/*共用体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0a其成员引用为:mm.a,mm.b,mm.c,mm.d但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。\x0d\x0a\x0d\x0amain()\x0d\x0a{\x0d\x0aunion data\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0amm.a=6;\x0d\x0aprintf("%d\n",mm.a);\x0d\x0amm.c=67.2;\x0d\x0aprintf("%5.1lf\n", mm.c);\x0d\x0amm.d='W';\x0d\x0amm.b=34.2;\x0d\x0aprintf("%5.1f,%c\n",mm.b,mm.d);\x0d\x0a}\x0d\x0a运行程序输出为:\x0d\x0a6\x0d\x0a6 7.2\x0d\x0a3 4.2,=\x0d\x0a程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“=”。事实上,字符的输出是无法得知的,由写入内存的数据决定。\x0d\x0a例子虽然很简单,但却说明了共用体变量的正确用法。

二、关于c语言共用体的问题

1、int型的变量占2个字节,而一个内存单元只有一个字节的大小,因此int型变量要分开放。

2、那怎么放呢?是这样的,先把int变量分成两个字节,前八位作为高字节,后八位作为低字节,这样,把高字节的那八位放在低地址内存单元,低字节的那八位放在高地址内存单元。

3、而long型的占四个字节,也是一样的,分成四个字节分开放,高字节放低地址内存单元。

4、你的程序中,只占一个字节的0x39给了int型的i[0],那这样,高字节为0,假设放在最低地址的内存单元中,那0x39就顺着往上放,i[1]也一样。好了,这样放完后,这个占四个字节的共用体变量的存储情况就是:0x38/0x00/0x39/0x00(说明:左手边为高地址,右手边为低地址)。

5、好了,我们现在是取long型的k,那很显然,低地址的存储单元是它的高字节,高地址的存储单元是它的低字节,这样就得到:0x00390038。

6、这是我用keil-C51仿真得到的结果,如果你问为什么结果跟你的不一样,那我只能回答:系统决定变量的存放方式。

三、c语言问题 公用体

1、在你上面那个例子中联合体的char类型他实际在内存中的字节数是4个字节

2、整个联合体的内存是12个字节因为联合体他的内存存储是跟相邻基础数据类型一致的

3、所占内容小的要扩张因为4个字节的类型不可能缩小所以内存直接为char分4个字节的内存