第11章第8节 §11.8共用体 一共用体的概念 1.什么是共用体 将多种类型数据,放在起始位置(首地址)相同的一段存贮单元,即多种数 据共用一段内存。(但同一时刻,只能放一种类型的数据) 2.共用体类型及共用体变量的的定义 )分开定义(先定义类型,后定义变量) union data int i; unIon共用体名 char ch; 成员表列 float f; union共用体名变量表列; nuon data a.b.c 2)同时定义 union data unon共用体名 char cha 成员表列 float f: }变量表列; 3 a, b, c; 3)直接定义 union unIon 成员表列 char ch; float f: }变量表列 3 a, b, c;
第11章第8节 §11.8 共 用 体 一. 共用体的概念 将多种类型数据, 放在起始位置(首地址)相同的一段存贮单元, 即多种数 据共用一段内存。(但同一时刻,只能放一种类型的数据) 1. 什么是共用体 2). 同时定义 union 共用体名 {成员表列 } 变量表列; union data {int i; char ch; float f; } a,b,c; 3). 直接定义 union {int i; char ch; float f; } a,b,c; union {成员表列 } 变量表列; 1). 分开定义(先定义类型,后定义变量) 2. 共用体类型及共用体变量的的定义 union 共用体名 {成员表列 }; union 共用体名 变量表列; union data {int i; char ch; float f; }; nuion data a,b,c;
第11章第8节 3.共用体类型与结构体类型的区别 结构体 种类型数据的组合,成员同时存在; 个结构体变量占内存:成员字节总和。 共用体 员不同时存在,某一时刻只有一个成员占用内存。 个共用体变量占内存:成员中最长字节 struct data union data Hint i; char ch char ch: float f; float f: ,y,2, 占字节数:2+1+4=7字节 占字节数:max{2,1,4}=4字节 共用体变量的引用 只能引用成员,不能引用共用体变量 printf("%d, a. i) printf(°xx 三共用体类型数据的特点 1.某一时刻只能放一种数据;并且是最近一次放入的数据。 2.共用体变量和各成员的地址相同;
第11章第8节 3. 共用体类型与结构体类型的区别 结构体 —— 多种类型数据的组合,成员同时存在; 一个结构体变量占内存:成员字节总和。 共用体 —— 成员不同时存在,某一时刻只有一个成员占用内存。 一个共用体变量占内存:成员中最长字节 union data {int i; char ch; float f; } a,b,c; struct data {int i; char ch; float f; } x,y,z; 占字节数:2+1+4=7字节 占字节数:max{2,1,4}=4字节 二. 共用体变量的引用 只能引用成员,不能引用共用体变量 printf(“%d”,a.i); printf(“%d”,a); 三. 共用体类型数据的特点 1. 某一时刻只能放一种数据;并且是最近一次放入的数据。 2. 共用体变量和各成员的地址相同;
第11章第8节 3.共用体变量不能初始化 union char ch fotf}a={1,a,1.5} 4.共用体变量不能用函数参数(新标准可以) 5.可以定义共用体数组unon f int i char ch float f, al 6共用体、结构体可以嵌套「共用体中包含结构体 结构体中包含共用体。 四.共用体的应用 1.同一个数据区间,根据不同的情况,存放不同类型的数据。 例:11.12 教师数据:身份证号,姓名,性别,职业,工资}→整型数 学生数据:身份证号,姓名,性别,职业,班级 →字符的广类型不同
第11章第8节 3. 共用体变量不能初始化 union { int i; char ch; float f;} a={1,’a’,1.5} 4. 共用体变量不能用函数参数(新标准可以) 5. 可以定义共用体数组 union { int i; char ch; float f;} a[10]; 6. 共用体、结构体可以嵌套 共用体中包含结构体; 结构体中包含共用体。 四. 共用体的应用 1. 同一个数据区间,根据不同的情况,存放不同类型的数据。 例:11.12 教师数据: 身份证号,姓名,性别,职业,工资 学生数据: 身份证号,姓名,性别,职业,班级 类型不同 整型数 字符串
include stdio. h' 第11章第2节 struct &char c 201 a[30]; char sex char job 结构体中含共用体 union int w har cla[201: )ca maint i struct p m[2] int i: float f printf("input data: " for(=0,i<2;i++ ( scanf("%s%s%C%", mi]. c,mi na, &m[]. sex, &mi] job if(m i].job==].job=='T) scanf(%d", &mi. ca w); 如职业为“t或‘T,输入工 else scanf("%s", m i cacla); 气资 否则输入班级 for(=0,i<2;i++) printf("%os, %os, %C, %c, " mi]. c, mi]. na, mi]. sex, mj] job); if(m(1]job==t'l m[i]. job-==T printf("%din",m([].ca w) else printf("%osn", mi]. ca cla); 3
# include"stdio.h" struct p {char c[20]; char na[30]; char sex; char job; union{ int w; char cla[20];} ca; } main() { struct p m[2]; int i; float f; printf("input data: "); for(i=0; i<2; i++) {scanf("%s %s %c %c",m[i].c,m[i].na,&m[i].sex,&m[i].job); if(m[i].job=='t'|| m[i].job=='T') scanf("%d",&m[i].ca.w); else scanf("%s",m[i].ca.cla); } for(i=0; i<2; i++) {printf("%s,%s,%c,%c,",m[i].c, m[i].na, m[i].sex, m[i].job); if(m[i].job=='t'|| m[i].job=='T') printf("%d\n", m[i].ca.w); else printf("%s\n",m[i].ca.cla);} } 第11章第2节 如职业为‘t’或‘T’,输入工 资 否则输入班级 结构体中含共用体
2.查看不同类型数据的存放 maino 24897—0110000101000001 i union 0110000101000001 char a[2] a[] x.b=24897: printf( %d, %C,%cIn, X b, xa[01,xa[1D; 97 65 结果:24897,A,a a[1] main( union 000000100000 i int b char a[2] 28+2=258 xal[0-2;xa[l=1; printf(%odn”,x.b); 结果:258
2. 查看不同类型数据的存放 main() { union { int b; char a[2]; } x; x.b=24897; printf(“%d,%c,%c\n”,x.b, x.a[0], x.a[1]); } 24897 0110000101000001 01100001 01000001 a[0] a[1] 97 65 结果: 24897, A, a main() { union { int b; char a[2]; } x; x.a[0]=2; x.a[1]=1; printf(“%d\n”,x.b); } 00000001 00000010 a[1] a[0] 2 8+2=258 x.b 结果: 258