C语言程序设计基础第10章 共用体

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

9.4共用体1.共用型概念使几个不同的变量占用同一段内存空间的结构称为共用型。2.共用类型的定义──与结构类型的定义类似union共用类型名{成员列表};3.共用变量的定义──与结构变量的定义类似直接定义形式如下:间接定义形式如下:union共用体名union共用体名{分量表{分量表};}变量表;union共用体名变量表;4.共用变量的引用与结构变量一样只能逐个引用共用变量的成员printf(“%d”,a);错误scanf(“%d”,&a);错误访问变量a各成员的格式为:a.i、a.ch、a.fscanf(“%d”,&a.i);printf(“%d\n”,a.i);5.共用体与结构体相似之处(1)都是由不同类型的数据项组成一个(2)都只能对分量进行操作和引用。例1:对共用体变量的使用struct{intnum;编号charname[10];姓名charsex;性别charjob;类别:s学生t教师union{intciass;班号charposition[10];职务}category;}per[2];构造类型(数组、结构体、共用体)的定义可以嵌套main(){intn,i;for(i=0;i2;i++){scanf(“%d%s%c%c”,&per[i].num,per[i].name,&per[i].sex,&per[i].job);if(per[i].job==‘s’)scanf(“%d”,&per[i].category.class);elseif(per[i].job==‘t’)scanf(“%s”,per[i].category.position);elseprintf(“inputerror!”);}prints(“\n”);}6.共用变量特点(1)系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,存放的和起作用的是最后一次存入的成员值。(2)由于所有成员共享同一内存空间,故共用变量与其各成员的地址相同。(3)不能对共用变量进行初始化(注意:结构变量可以);也不能将共用变量作为函数参数,以及使函数返回一个共用数据,但可以使用指向共用变量的指针。(4)共用类型可以出现在结构类型定义中,反之亦然。structmemb{floatv;intn;charc;}sa1;sa1占7个字节内存空间unionmemb{floatv;intn;charc;}usa2;usa2占4个字节内存空间100110051007vnc2001vnc200220032004共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。7、共用体与结构体的主要区别(1)结构体变量占用空间是各成员所占空间之总和;共用体变量占存储空间是各成员中所占空间最大者。(2)结构体变量各成员占用内存中一片连续的存储区,各成员的地址互不相同;共用体变量各成员在内存中所占空间的起始地址相同。(3)结构体变量的各个分量在任何时刻都同时存在,且可同时引用。共用体变量的各个分量在同一时刻只存在其中一个,也只能引用其中的一个。(4)结构体变量可以初始化,共用体变量不能初始化。例2:共用体的内存使用。#includestdio.hvoidmain(){union{inti;charstring[2];}a;a.i=24897;printf(“i=%d,string1=%c”,a.i,a.string[0]);printf(“string2=%c\n”,a.string[1]);string[0]=’0’;string[1]=’0’;printf(“i=%d,string1=%c”,a.i,a.string[0]);printf(“string2=%c\n”,a.string[1]);}程序运行结果:i=24897,string1=A,string2=ai=8224,string1=0,string2=0例3:将共用体变量作为函数的参数。#includestdio.huniontest{inti;charstring[2];}a;voidshow(uniontesta){printf(“i=%d,string1=%c”,a.i,a.string[0]);printf(“string2=%c\n”,a.string[1]);return;}voidmain(){a.i=24897;show(a);string[0]=’0’;string[1]=’0’;show(a);return;}程序运行结果:I=24897,string1=A,string2=aI=8224,string1=0,string2=01.定义格式:enum枚举类型名{取值表};例如,enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat};{}中的标识符称为枚举常量。它只能为标识符,不能为数字常量或字符常量2.枚举变量的定义(与结构体变量类似)(1)间接定义例如,enumweekdaysw1,w2;(2)直接定义例如,enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat}w1,w2;9.5枚举类型3.枚举型使用说明(1)枚举型仅适应于取值有限的数据。例如:1周7天,1年12个月。(2)取值表中的值为枚举元素,其含义由程序解释。例如,不是写成“Sun”就自动代表“星期天”。事实上,枚举元素用什么表示都可以。(3)枚举型变量w1,w2只能在定义的值表中取其中一个枚举常量作为当前值。(4)枚举元素作为常量是有值的。定义时顺序号,从0开始,所以枚举元素可以进行比较,比较规则是:序号大者为大!例如,上例中的Sun=0、Mon=1、……、Sat=6,所以MonSun、Sat最大。(5)枚举元素的值也是可以改变的。在定义时由程序指定,例如:enumweekdays{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};则Sun=7,Mon=1,从Tue=2开始,依次增1。(6)一个整型数值不能直接赋值给一个枚举变量。enumweekdays{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};enumweekdayswk1;不允许直接赋值整数:wk1=7;/*数据类型不同*/只能写成:wk1=Sun;或:wk1=(enumweekdays)7;甚至可以是表达式,如:w2=(enumweekday)(5-3);例4:枚举类型的用法#includestdio.henummonths{JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};main(){enummonthsmonth;char*mname[]={,January,February,March,April,May,June,July,Auguest,September,October,November,Dcember};for(month=JAN;month=DEC;month++)printf(%2d--%-10s\n,month,mname[month]);}9.6typedef类型定义除可直接使用C提供的标准类型和自定义的类型(结构、共用、枚举)外,也可使用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。(1)简单的名字替换typedefcharCHARACTER;经过上面的定义后CHARACTER就与数据类型char等价,同样也可以用CHARACTER来定义字符型变量。例如:typedefcharCHARACTER;chara;CHARACTERb;变量a,b都是字符型。(2)定义一个类型名代表一个结构体类型。例如;typedefstruct{charnumber[9];charname[8];chardepartment[50];}STUDENT;STUDENTstud1,stud2;上面定义的变量stud1和stude2都属于结构体变量,这样就简单化了结构体变量的声明。typedefint*zzbl;zzblp,a[6];等价于int*p,*a[6];/*p是整型指针变量,a[]是整型指针数组*/说明:(1)用typedef只是给已有类型增加1个别名,并不能创造1个新的类型。(2)typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。9.7位运算•1、位逻辑运算符–~按位取反(与!同级)单目右结合–&按位与–^按位异或相同取0,不同取1–|按位或1、位逻辑运算符–~按位取反–&按位与–^按位异或相同取0,不同取1–|按位或–x=00000000000000000–y=30000000000000011x&y0000000000000000x|y0000000000000011x^y00000000000000111010^0101=1111•注意区分:•&和|•&&和||•x&&y得0•x||y得12、位移位运算符–对操作数左移给出的位数–对操作数右移给出的位数–x3将x向左移3位,空出的位用零填补–001110103–11010000–x3将x向右移3位–001110103–000001113、复合位赋值运算符–&=–|=–^=–=–=–例:a&=b相当于a=a&b–a=2相当于a=a29.8宏定义#define宏名标识符宏定义字符串编译时,把程序中所有与宏名相同的字符串,用宏定义字符串替代。#definePI3.14#definearr_size4带参数的宏定义例:用宏实现两个变量值的交换#definef(a,b,t)t=a;a=b;b=t;voidmain(){intx,y,t;scanf(“%d%d”,&x,&y);f(x,y,t)printf(“%d%d\n”,x,y);}t=x;x=y;y=t;编译时被替换注意:(1)带参数的宏定义不是函数,宏与函数是两种不同的概念。(2)宏可以实现简单的函数功能

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功