11高级程序语言.ppt
&构造数据类型,也叫共用体&用途:使几个不同类型的变量共占一段内存(相互覆盖)联合类型定义定义形式:union 联合名 类型标识符 成员名;类型标识符 成员名;.;例 union data int i;char ch;float f;fchi类型定义不分配内存第十一讲 联合类型形式一:union data int i;char ch;float f;a,b;形式二:union data int i;char ch;float f;union data a,b,c,*p,d3;形式三:union int i;char ch;float f;a,b,c;联合变量的定义fchifchiab联合变量定义分配内存,长度=最长成员所占字节数联合变量任何时刻只有一个成员存在联合变量引用v引用方式:例 a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对)v引用规则l不能引用联合变量,只能引用其成员联合指针名-成员名联合变量名.成员名(*联合指针名).成员名union data int i;char ch;float f;union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.fl联合变量中起作用的成员是最后一次存放的成员例 union int i;char ch;float f;a;a=1;()l不能在定义联合变量时初始化例 union int i;char ch;float f;a=1,a,1.5;()l可以用一个联合变量为另一个变量赋值例 float x;union int i;char ch;float f;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;()例 将一个整数按字节输出01100001 01000001低字节高字节0100000101100001ch0ch1运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain()union int_char int i;char ch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);结构类型与联合v区别:存储方式不同struct node char ch2;int k;a;union node char ch2;int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在v联系:两者可相互嵌套例 结构类型中嵌套联合 name numsexjobclasspositionLiWang10112086FMST501prof循环n次读入姓名、号码、性别、职务job=s真真假假读入class读入position输出“输入错”循环n次job=s真假输出:姓名,号码,性别,职业,班级输出:姓名,号码,性别,职业,职务job=tstruct int num;char name10;char sex;char job;union int class;char position10;category;person2;例联合中嵌套结构类型,机器字数据与字节数据的处理 00010010 00110100低字节高字节0011010000010010lowhigh0 x123400010010 11111111低字节高字节1111111100010010lowhigh0 x12ffstruct w_tag char low;char high;union u_tag struct w_tag byte_acc;int word_acc;u_acc;word_accbyte_acc.lowbyte_acc.highu_acc例例 6.13 编程,输入一个长整型的整数,分别取出该数的各字节的值。分析:分析:定义一个联合类型如下所示:union data char s5;long n;#include union datachar s5;long n;void main(void)union data x;int i;printf(“输入一个长整数:”);scanf(“%lx”,&x.n);printf(“各字节取值如下:n”);for(i=0;isizeof(long);i+)printf(“第%d个字节:%x”,i,x.si);printf(“n”);例例 6.14 编程存放学生的下述信息:姓名、学号和当前住址,其中学生当前编程存放学生的下述信息:姓名、学号和当前住址,其中学生当前住址有两种情况:在校住宿学生用学校地址(楼房名和房间号),非在校住址有两种情况:在校住宿学生用学校地址(楼房名和房间号),非在校学生用家庭住址(街道号、街道名和城市名)。并输出指定姓名学生的当学生用家庭住址(街道号、街道名和城市名)。并输出指定姓名学生的当前住址。前住址。分析:分析:struct off_schoolint strnum;/*街道号*/char strname20;/*街道名*/char city20;/*城市名*/;struct in_schoolint roomnum;/*房间号*/char dorm20;/*楼房名*/;union addressstruct off_school town;struct in_school gown;struct studentint num;/*学号*/char name20;/*姓名*/char off_in;/*是否在学校住*/union address ad;/*当前住址*/;#include include#define N 3struct off_schoolint strnum;char strname20;char city20;struct in_schoolint roomnum;char dorm20;union addressstruct off_school town;struct in_school gown;struct studentint num;char name20;char off_in;union address ad;void main(void)struct student sN;char name20;int i;for(i=0;iN;i+)printf(“请输入第%d个学生数据n”,i+1);printf(“学号:”);scanf(“%d”,&si.num);printf(“姓名:”);gets(si.name);getchar();printf(“是否在校住宿学生(n在校住宿、其他表示非在校住宿):”);si.off_in=getchar();printf(“请输入当前地址n”);i f(si.off_in=n)printf(“请输入房间名和房间号:”);scanf(“%d%s”,&si.ad.gown.roomnum,si.ad.gown.dorm);else printf(“请输入街道号、街道名和城市名:”);scanf(“%d%s%s”,&si.ad.town.strnum,si.ad.town.strname,si.ad.town.city);printf(“输入姓名”);gets(name);for(i=0;iN;i+)if(!strcmp(si.name,name)if(si.off_in=n)printf(“姓名:%s是在校住宿学生n”,si.name);printf(“楼房名:%s房间号:%dn”,si.ad.gown.dorm,si.ad.gown.roomnum);elseprintf(“姓名:%s非在校住宿学生n”,si.name);printf(“城市名:%s楼房名:%s房间号:%dn”,si.ad.town.city,si.ad.town.strname,si.ad.town.strnum);else printf(“没有这个学生”);