在c语言中,共用体一般有什么作用?

Python014

在c语言中,共用体一般有什么作用?,第1张

共用体一般指联合体,作用如下:

1、节省内存

有两个很长的数据结构,不会同时使用,用结构体的话,只占用最长的那个数据结构所占用的空间,就足够了。

2、做某些转换用

union{char a[8]double x}

x=20.8

cout<<hex<<a[0]<<“ ”<<a[1]<<…<<endl

扩展资料:

结构体和共用体

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。

共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共用体也是一种自定义类型,可以通过它来创建变量,

参考资料来源:百度百科-共用体

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:

union 共用体名

{成员表列};

union data

{

int a

float b

doublec

chard

}obj

该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。

union data /*共用体*/

{

int a

float b

double c

char d

}mm

struct stud /*结构体* /

{

int a

float b

double c

char d

}

main( )

{

struct stud student

printf("%d,%d",sizeof(struct stud),sizeof(union data))

}

运行程序输出:

15,8

程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。

对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。

可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:

union data /*共用体*/

{

int a

float b

double c

char d

}mm

其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。

main( )

{

union data

{

int a

float b

double c

char d

}mm

mm.a=6

printf("%d\n",mm.a)

mm.c=67.2

printf("%5.1lf\n", mm.c)

mm.d='W'

mm.b=34.2

printf("%5.1f,%c\n",mm.b,mm.d)

}

运行程序输出为:

6

6 7.2

3 4.2,=

程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。

例子虽然很简单,但却说明了共用体变量的正确用法。

我测试了一下

int为32bit

,long为32位

,char为8位机测试。

分析得出这样的结果:

这正如共用结构体中

假如他们的共用首地址为0x10000000

那么

地址

变量

0x10000000:

a[0]

如果执行语句

s.a[0]=0x39

0x10000004:

a[1]

相差4个字节

那么会产生如下变化:

0x10000000:

b

a[0]=0x39

b[0]=0x39

c[0]=0x39(

字符c[0]="9")

0x10000000:

c[0]

如果再执行语句

s.a[1]=0x38

0x10000001:

c[1]

那么会产生如下变化:

0x10000002:

c[2]

a[1]=0x38

0x10000003:

c[3]

相差1个字节

也即是地址0x10000000到0x10000003中的数据为0x00000039

也即是地址0x10000004到0x10000007中的数据为0x00000038

虽然是共用体,但是a

b

c同用了一个地址

如果对a赋值了也同时对b和c赋值

只是数据类型不同而已。

如果从地址上来分析

c如果定义的是c[8],那么c[5]地址即为0x10000004

它的值就因该为0x38,因为和a[1]的地址相同。

查看b的是后可以直接用%d来查看

因为在本机上也是32bit和int相同