C51构造数据类型.ppt

上传人:max****ui 文档编号:3402878 上传时间:2019-12-13 格式:PPT 页数:58 大小:1.12MB
返回 下载 相关 举报
C51构造数据类型.ppt_第1页
第1页 / 共58页
C51构造数据类型.ppt_第2页
第2页 / 共58页
C51构造数据类型.ppt_第3页
第3页 / 共58页
点击查看更多>>
资源描述
第5章C51构造数据类型,数组,构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定,一维数组,一维数组的定义定义方式:数据类型数组名常量表达式;,合法标识符,表示元素个数下标从0开始,:数组运算符单目运算符优先级(1)左结合不能用(),例inta6;,编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型),数组名表示内存首地址,是地址常量,一维数组的引用,数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组数组元素表示形式:数组名下标其中:下标可以是常量或整型表达式,初始化方式,inta5=1,2,3,4,5;等价于:a0=1;a1=2;a2=3;a3=4;a4=5;,说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如inta5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;如inta3=6,2,3,5,1;(),staticinta5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;,inta=1,2,3,4,5,6;编译系统根据初值个数确定数组维数,一维数组的初始化,二维数组,二维数组的定义定义方式:数据类型数组名常量表达式常量表达式;,数组元素的存放顺序原因:内存是一维的二维数组:按行序优先多维数组:最右下标变化最快,例inta34;,每个元素ai由包含4个元素的一维数组组成,二维数组a是由3个元素组成,二维数组理解,字符数组定义,字符数组的初始化逐个字符赋值用字符串常量字符数组的引用,5.3字符数组和字符串,字符数组,字符串及其结束标志无字符串变量,用字符数组处理字符串字符串结束标志:0,指针,C51程序设计中使用指针可以:使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值,变量与地址,程序中:inti;floatk;,内存中每个字节有一个编号-地址,i,k,编译或函数调用时为其分配内存单元,变量是对程序中数据存储空间的抽象,指针的概念,指针:一个变量的地址指针变量:专门存放变量地址的变量叫,2000,指针,指针变量,变量的内容,变量的地址,指针与指针变量,含义,含义:取变量的地址单目运算符优先级:2结合性:自右向左,含义:取指针所指向变量的内容单目运算符优先级:2结合性:自右向左,两者关系:互为逆运算理解,i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据float*q;staticchar*name;,注意:1、int*p1,*p2;与int*p1,p2;2、指针变量名是p1,p2,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值,5.2指针变量,一般形式:存储类型数据类型*指针名=初始地址值;,赋给指针变量,不是赋给目标变量,例inti;int*p=,变量必须已说明过类型应一致,例inti;int*p=,用已初始化指针变量作初值,例main()inti;staticint*p=.(),不能用auto变量的地址去初始化static型指针,指针变量的初始化,例main()inti=10;int*p;*p=i;printf(“%d”,*p);,危险!,例main()inti=10,k;int*p;p=,指针变量必须先赋值,再使用,指针与数组,指向数组元素的指针变量,例intarray10;int*p;p=,数组名是表示数组首地址的地址常量,指针变量的赋值运算p=(指针变量p2值p1)不能把一个整数p,也不能把p的值整型变量,如inti,*p;p=1000;()i=p;(),指针变量与其指向的变量具有相同数据类型,指针的运算,指针的数据类型,例题,有一个包含5个元素的数组,DispBuf0,DispBuf1,DispBuf2,DispBuf4,DispBuf5,这些变量值分别为0 x1001,0 x1002,0 x1003,0 x1004,0 x1005,调试,观察指针变量的基类型改变所带来的变化。定义数组。用数码管显示数组内的数值,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义,struct结构体名类型标识符成员名;类型标识符成员名;.;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,结构体,例structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,结构体类型定义描述结构的组织形式,不分配内存,结构体类型定义的作用域,例子图解,先定义结构体类型,再定义结构体变量一般形式:,struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名变量名表列;,5.2结构体变量的定义,一般形式:,struct结构体名类型标识符成员名;类型标识符成员名;.变量名表列;,例structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,定义结构体类型的同时定义结构体变量,一般形式:,struct类型标识符成员名;类型标识符成员名;.变量名表列;,例structintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,用无名结构体直接定义变量只能一次,直接定义结构体变量,结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期,说明:,引用规则结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名,5.3结构体变量的引用,形式一:,struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名结构体变量=初始数据;,例structstudentintnum;charname20;charsex;intage;charaddr30;structstudentstu1=112,“WangLin”,M,19,“200BeijingRoad”;,5.4结构体变量的初始化,struct结构体名类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;,例structstudentintnum;charname20;charsex;intage;charaddr30;stu1=112,“WangLin”,M,19,“200BeijingRoad”;,结构体变量的初始化形式二:,struct类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;,例structintnum;charname20;charsex;intage;charaddr30;stu1=112,“WangLin”,M,19,“200BeijingRoad”;,结构体变量的初始化形式三:,指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符优先级:1结合方向:从左向右,例指向结构体的指针变量,例intn;int*p=n=10,structstudentstu1;structstudent*p=(*p).num=101,5.5结构体和指针,用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-多值传递,效率低,用指向结构体的指针作函数参数,structdatainta,b,c;main()voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%darg.b=%darg.c=%dn,arg.a,arg.b,arg.c);printf(CallFunc().n);func(arg);printf(arg.a=%darg.b=%darg.c=%dn,arg.a,arg.b,arg.c);voidfunc(structdataparm)printf(parm.a=%dparm.b=%dparm.c=%dn,parm.a,parm.b,parm.c);printf(Process.n);parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf(parm.a=%dparm.b=%dparm.c=%dn,parm.a,parm.b,parm.c);printf(Return.n);,copy,例用结构体变量作函数参数(1),structdatainta,b,c;main()voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%darg.b=%darg.c=%dn,arg.a,arg.b,arg.c);printf(CallFunc().n);func(,例用结构体指针变量作函数参数(2),构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:,union共用体名类型标识符成员名;类型标识符成员名;.;,例uniondatainti;charch;floatf;,类型定义不分配内存,5.6共用体,形式一:uniondatainti;charch;floatf;a,b;,形式二:uniondatainti;charch;floatf;uniondataa,b,c,*p,d3;,形式三:unioninti;charch;floatf;a,b,c;,共用体变量定义分配内存,长度=最长成员所占字节数,共用体变量任何时刻只有一个成员存在,共用体变量的定义,引用方式:,例a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对),引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例unioninti;charch;floatf;a;a=1;(),不能在定义共用体变量时初始化,例unioninti;charch;floatf;a=1,a,1.5;(),可以用一个共用体变量为另一个变量赋值,例floatx;unioninti;charch;floatf;a,b;a.i=1;a.ch=a;a.f=1.5;b=a;()x=a.f;(),共用体变量引用,运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a,main()unionint_charinti;charch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%onch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);,例将一个整数按字节输出,区别:存储方式不同,联系:两者可相互嵌套,结构体与共用体,功能:用自定义名字为已有数据类型命名类型定义简单形式:typedeftypename;,例typedefintINTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例typedeffloatREAL;,类型定义后,与已有类型一样使用,例INTEGERa,b,c;REALf1,f2;,说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与define不同,definetypedef预编译时处理编译时处理简单字符置换为已有类型命名,用typedef定义类型,按定义变量方法先写出定义体如inti;将变量名换成新类型名如intINTEGER;最前面加typedef如typedefintINTEGER;用新类型名定义变量如INTEGERi,j;,例定义数组类型inta100;intARRAY100;typedefintARRAY100;ARRAYa,b,c;,inta100,b100,c100;,例定义指针类型char*str;char*STRING;typedefchar*STRING;STRINGp,s10;,char*p;char*s10;,typedef定义类型步骤,enum是关键字;枚举名和枚举常量是标识符;枚举常量之间用逗号分隔。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enumcolor1blue,green,red;enumflagfalse,true;,枚举类型,1.枚举类型的定义,枚举类型定义的一般形式:enum枚举名枚举常量取值表;,枚举是一个具有有限个整型符号常量的集合,这些整型符号常量称为枚举常量。每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的取值范围。,在枚举类型中,每个枚举常量都代表一个整型值。在定义枚举类型的同时可隐式或显式地定义枚举常量所代表的值。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;,枚举类型,2.枚举常量的整型值,隐式定义:按照类型定义时枚举常量列举的顺序分别代表0、1、2、等整型值。,0,1,2,3,4,5,6,例如:enumopplus=43,minus=45,multiply=42,divide=47;enumworkdayMon=1,Tue,Wed,Thu,Fri;,枚举类型,2.枚举常量的整型值,显式定义:在定义类型的同时指定枚举常量的值,其中如有未指定值的枚举常量,则根据前面的枚举常量的值依次递增1。,2,3,4,5,例如:enumflagfg;enumcolor1c1;enumcolor2blank,brown,yellow,whitec2;enumlightblue,lightgreen,lightredc3;,枚举类型,3.枚举变量的定义,枚举类型变量定义的三种形式:enum枚举名枚举变量名表;enum枚举名枚举常量取值表枚举变量表;enum枚举常量取值表枚举变量表;,赋值运算,枚举类型,4.枚举数据的运算,用sizeof运算符计算枚举变量所占内存空间,枚举变量中存放的是整型值,每个枚举变量占用2个字节,是enumcolor2类型的枚举值,enumflagfalse,truefg;enumcolor1blue,green,redc1;enumcolor2blank,brown,yellow,whitec2;enumlightblue,lightgreen,lightredc3;fg=true;c1=red;c2=yellow;c3=lightblue;c3=white;,取址运算enumcolor2blank,brown,yellow,whitec2;enumflagfg;enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;,在C系统中,不能直接对枚举数据进行输入和输出。由于枚举变量可以作为整型变量处理,所以可以通过间接方法输入输出枚举变量的值。,枚举变量的输出方法一:直接输出枚举变量中存放的整型值。,枚举类型,5.枚举数据的输入输出,枚举变量的输入,枚举变量作为整型变量进行输入。例如:scanf(%d,1,含义不直观,fg=true;printf(%d,fg);,switch(fg)casefalse:printf(false);break;casetrue:printf(true);,枚举类型,5.枚举数据的输入输出,枚举变量的输出,方法二:利用多分支选择语句输出枚举常量对应的字符串。,enumflagfalse,truefg;char*name=false,true;fg=true;printf(%s,namefg);,枚举类型,5.枚举数据的输入输出,枚举变量的输出,方法三:依据枚举值,运用指针方法输出对应的字符串。,fg=true;printf(%s,fg);,枚举类型,5.枚举数据的输入输出,枚举变量的输出,枚举常量是标识符,不是字符串,以输出字符串方式输出枚举常量是错误的。,枚举类型,【例11.10】编制一个程序。当输入今天的星期序号后,输出明天是星期几。enumweekdayMon=1,Tue,Wed,Thu,Fri,Sat,Sun;char*name8=error,Mon,Tue,Wed,Thu,Fri,Sat,Sun;,枚举类型,main()enumweekdayd;printf(Inputtodaysnumeral(1-7):);scanf(%d,类型重命名,1.为类型名定义别名,为类型名定义别名的一般形式:typedef类型名新类型名或typedef类型定义新类型名,用typedef为已存在的类型名再命名一个新的类型名(即别名)。,typedef是关键字;类型名可以是基本类型、构造类型、指针类型或自定义类型名;新类型名是自定义的类型名。,类型重命名,typedefintCOUNTER;/*定义COUNTER为整型类型名*/typedefstructdateintyear;intmonth;intday;DATE;/*定义DATE为structdate结构体类型名*/,新类型名与旧类型名作用相同,并且可同时使用。,inti;与COUNTERi;等价。structdatebirthday;与DATEbirthday;等价。,类型重命名,2.为类型命名的方法,为基本类型命名例如:typedeffloatREAL;REALx,y;/*相当于floatx,y;*/,以typedef开头,加上变量定义的形式,并用新类型名替代变量名。,为数组类型命名例如:typedefcharCHARR80;CHARRc,d4;/*相当于charc80,d480;*/,类型重命名,2.为类型命名的方法,为指针类型命名例如:typedefint*IPOINT;IPOINTip;/*相当于int*ip;*/IPOINT*pp;/*相当于int*pp;*/,typedefint(*FUNpoint)();FUNpointfunp;/*相当于int(*funp)();*/,类型重命名,2.为类型命名的方法,为结构体、共用体类型命名例如:structnodecharc;structnode*next;typedefstructnodeCHNODE;CHNODE*p;/*相当于structnode*p;*/,structCHNODE*p;,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!