组合(union )的声明和结构与结构体相似,但本质不同。 的所有成员都引用了内存中的同一位置。 单身的爆米花,想在不同的时间把不同的东西保存在同一个地方的时候,可以使用组合。
结构(struct )的所有变量为“共存”的——的优点是“有容乃大”,是全面的; 缺点是结构内存空间分配粗放,无论是否使用,都是全分配。
另一方面,在联合体(union )中各变量为“互斥”的——的缺点是“包容”不够。 但是,内存的使用更加细致灵活,具有还可以节约内存空间的优点。
简单的程序分析
#include 'stdio.h' 2 union{ 3 int a; 4浮动b; 5 char c; 6 ) x; 7intmain(8)8 { 9 x.c='x '; 10 x.b=3.14; 11 x.a=25; 12printf((g(t ) c ) t ) d(t ) n )、x.b、x.c、x.a ); 13返回0; 14 )输出结果为3.50325e-44垃圾值25
只知道最后的x.a=25; x.b复盖x.c的地址,x.a复盖x.b的地址,所以前两个打印是垃圾值,只有最后一个打印是正确的。
程序分析2
# include stdio.hunionvar { longintl; int i; (; main () { union var v; v.l=5; printf(V.Lis%D(N ),v.i ); v.i=6; printf(nowv.Lis%LD! the address is %pn ',v.l,v.l; printf(nowv.Iis%d! the address is %pn ',v.i,v.i; (结果) v.l is 5 now v.l is 6! theaddressis0x BF ad1 e2cno wv.IIS 6! the address is0xbfad1e2c
程序分析3
#includestdio.h union u{ int i; 双精度d; //这个union有8字节的大小}; main () { union u ttdxg; ttdxg.i=10; printf(%d(n ),ttdxg.i ); char * c; c=(char* ) ttdxg; 代入union的起始地址,输入char类型c[0]='a '; c[1]='b '; c[2]='c '; c[3]=' '; c[4]='d '; c[5]='e '; //最大c[7]printf('%sn”,c ); //使用结束符' '将字符串' ABC'printf(%c%c%c%c%c(c(n ),c(1),c (2),c(3),c (4),c )
输出功率
10
哥伦比亚广播公司
a b c d e
printf(%s(n ),c ); //用终端符号" "打印字符串" abc "字符串以" "结束,所以之后不打印
程序分析4
main () )
{ struct { char name[10]; int age; char job; union { int class; char office[10]; (} depa; }body[2]; int n,I; for(I=0; i2; I ) printf (输入名称,age,jobanddepartment(n ) ); scanf('%s%d%c )、body[i].name、body[i].age、body[i].job ); if(body[I].job=='s ' ) ) Scanf )、body[i].depa.class ); ELSEscanf('%s ',body[i].depa.office ); } printf (name (tagejobclass/office (n ); for(I=0; i2; I ) if(body[I].job=='s ' ) (printf ) ) %st=<; %dn ),body[i].name,body[i].age,body[I] )。 elseprintf('%s(t=<; %s(n ),body[i].name,body[i].age,body[i].job,body[i].depa.office }