结构体、联合体.ppt

上传人:max****ui 文档编号:12554054 上传时间:2020-05-11 格式:PPT 页数:28 大小:166KB
返回 下载 相关 举报
结构体、联合体.ppt_第1页
第1页 / 共28页
结构体、联合体.ppt_第2页
第2页 / 共28页
结构体、联合体.ppt_第3页
第3页 / 共28页
点击查看更多>>
资源描述
第九章结构体与联合体,9.1结构体与结构体变量的定义结构体是一种构造数据类型。数组也是构造数据类型,但数组要求其数组元素的数据类型必须是一致的,而在实际编程中要处理的大量复杂数据对象,其组成成员(元素)的数据类型往往是不一致的,这时我们就可以使用结构体类型来描述。一个学生的5门课程的成绩:floatscore5一个学生的基本信息:学号、姓名、性别、成绩和生日。(5个数据是一个整体,但类型不一致)结构体:将不同类型的数据组织在一起,形成新的一种数据类型(9),9.1.1结构体的定义定义形式:struct结构体成员类型说明;下面是定义了一个学生结构体数据类型:structstudentunsignedintnumber;char*name;charsex;floatscore;,一个结构体的结构体成员类型是没有限制的,可以是C语言中任何类型的变量,可以是基本数据类型,也可以是构造类型,还可以是指针类型。当结构体成员也是结构体类型时,称之为结构体的嵌套,即一个结构体中可以包含另一个结构体的结构体变量。将上例中定义的学生结构体数据类型再加上一个出生日期结构体成员,可描述如下:,structdate/*date是结构体名,是一种类型而不是一个变量*/*day,month,year是结构体成员*/intday;intmonth;intyear;structstudentunsignedintnumber;char*name;charsex;floatscore;structdatebirthday;/*结构体嵌套*/;,注意:(1)结构体是一种构造出来的数据类型。(2)结构体成员可以是任何数据类型。(3)使用结构体类型(结构体名)定义变量时应在结构体名前加struct关键字。,9.1.2结构体变量的定义结构体变量定义形式:struct;例如:structstudentd1,d2,*ps,d10;/*先定义一个结构体类型,再使用结构体定义结构体变量*/或structstudentunsignedintnumber;char*name;charsex;floatscore;structdatebirthday;d1,d2,*ps,d10;/*该定义把结构体的定义和结构体变量的定义合在一起,定义了两个结构体变量d1和d2,一个指向结构体变量的指针pd和一个一维结构体数组d。*/,用来指定该结构体变量所属的结构体模式,用来给出一个或多个结构体变量名,多个结构体变量名之间用逗号隔开,如果将结构体模式和结构体变量的定义合在一起,并且只进行一次结构体变量的定义,则可以省略结构体名,这样的结构体称为无名结构体。struct;例如:structunsignedintnumber;char*name;floatscore;s1,*ps,ss50;,structaddrchar*addr;addr;,注意:(1)区别结构体名、结构体成员名和结构体变量名(2)三个名字可以相同(在三个不同的位置)(3)结构体变量占用的内存空间是各成员变量所占内存空间大小之和。,9.2结构体类型变量的引用和初始化,9.2.1结构体类型变量的引用在对结构体变量引用时,一般只能对其成员进行直接操作,而不准许对结构体变量整体直接进行操作。也就是说,通过对结构体变量成员的访问操作达到对结构体变量整体的访问操作。结构体变量成员的两种引用形式:第一种形式:使用结构体成员运算符方式.d1.numberd1.named1.birthday.day(嵌套)“.”表示结构体成员变量的运算符,其结合性为从左至右。,第二种形式:通过指向结构体变量的指针表示结构体的成员(成员指针)-(*).ps-number(*ps).number,9.2.2结构体类型变量的初始化结构体变量初始化:在定义结构体变量的同时,对其成员变量赋值struct=初始数据列表;初始数据列表中有多个数据项时,数据项之间用逗号隔开,初始数据列表中的数据个数要和结构体的成员个数相同,且对应数据要一致。structstudentd1,d2=50403,”zhangsan”,m,86.5,3,12,1987例如,定义一个日期结构体类型变量。structdateintday;intmonth;intyear;structdated1=12,10,1999;,9.2.3结构体类型变量的简单例子(赋值)对结构体变量整体是不能直接输入输出的,只能通过引用结构体变量最低层成员的方法来操作结构体变量值。给结构体变量的赋值相当于给结构体各个成员的赋值。d1.number=50403;strcpy(d1.name,”lisi”);d1.sex=m;d1.score=70.0;d1.birthday.day=26;d1.birthday.month=6;d1.birthday.year=1986;,可以将一个结构体变量的值整体赋给一个相同类型的结构体变量d2=d1;,还可以通过标准输入函数scanf()通过终端来为结构体变的各个成员赋值。scanf(“%s”,book1.booknum);scanf(“%s”,book1.bookname);scanf(“%s”,book1.price);,输出结构体变量的各个成员值:使用标准输出函数printf()printf(“%s”,book1.bookname);,9.3结构体数组,结构体数组:以结构体类型数据为元素的数组。(具有相同类型的结构体变量)9.3.1结构体数组的定义结构体数组定义形式:(和一般数组一样,也必须先定义后引用)struct;例如:structstudentd5;可以把结构体的定义和结构体数组的定义分开(如上面的方式),也可以合在一起定义,其定义形式为:struct;,structstudentunsignedintnumber;char*name;charsex;floatscore;structdatebirthday;d5;,9.3.2结构体数组的初始化结构体数组在定义的同时可以初始化。其初始化的一般形式就是将数组初始化与结构体变量的初始化相结合,即在结构体数据变量定义之后紧跟一个用花括号括起来的一组初始数据值:其格式如下:struct=初始数据值列表;或struct=初始数据值列表;structstudentd5=50401,”zhangsan”,m,86.5,3,12,1987,50402,”lisi”,m,70.0,4,11,1987,50403,”limei”,f,80.0,4,16,1987,50404,”wangwu”,m,85.0,2,11,1987,50405,”wangyi”,m,85.0,2,15,1987;,9.3.3结构体数组的应用【例9.1】计算学生每门课的总成绩、平均成绩。#includestructstuintnumber;char*name;floatscore2;structstustudents5=1001,Wangli,90,89,1002,Zhangyi,99,89,1003,Gaowei,85,93,1004,Chenjiang,97,88,1005,Lilin,82,98;main()inti;floataver1,aver2,sum1=0,sum2=0;for(i=0;inumber等价于(*pb).number等价于students0.number(pb+1)-number等价于(*(pb+1).number等价于students1.number,上面各指针成员的描述分别等价于以下描述:(*ps).number表示指针ps的number成员;(*ps).name表示指针ps的name成员;(*ps).sex表示指针ps的sex成员;(*ps).score表示指针ps的score成员;(*ps).birthday.day表示指针ps的birthday成员的day成员;(*ps).birthday.month表示指针ps的birthday成员的month成员;(*ps).birthday.year表示指针ps的birthday成员的year成员;区别:*ps-number*ps-number+(*ps-number)+*ps+-number,9.4.3结构体指针的应用举例【例9.2】给出下面程序的运行结果。structssintno;char*l;main()structsssv=1,Wang,2,Zhang;structss*q;q=sv;printf(%c,+*q-l);printf(%2d,(*q).no);printf(%2d,+q-no);printf(%2d,(+q)-no);printf(%2cn,*(q+)-l);,运行结果是:X122Z,【例9.3】建立一个结构体数组(设有5个元素),然后通过指针的方式对它输入数据,最后输出这些数据。程序中将数组元素的输入输出分别用两个函数来实现,为了便于对结构体数组的共享,将其定义为外部变量(全局变量)。#includestructmfcharname20;unsignedage;charsex7;structmfperson5,*p=person;main()data_in();data_out();,data_in()printf(age:sex:name:n);for(p=person;page,p-sex);gets(p-name);data_out()for(p=person;pname,p-age,p-sex);运行情况如下:age:sex:name:20maleLingHong21femaleWangHong,输出结果为:LingHong;20;maleWangHong;21;female,9.5结构体在函数间的传送,9.5.1用数据复制方式传送结构体变量形参定义成结构体类型,实参与形参的类型相同,实参和形参属于相同的结构体模式。【例9.4】编程求两个复数的和与积。z1=a1+b1i,z2=a2+b2i;和:z=z1+z2=(a1+a2)+(b1+b2)i;积:z=z1*z2=(a1*a2-b1*b2)+(a1*b2+a2*b1)istructcomplexfloatreal;floatimage;structcomplexcadd(structcomplexx,structcomplexy)structcomplexr;r.real=x.real+y.real;r.image=x.image+y.image;return(r);,structcomplexmulitiply(structcomplexx,structcomplexy)structcomplexr;r.real=x.real*y.real-x.image*y.image;r.image=x.real*y.image+x.image*y.real;return(r);main()structcomplexz1,z2,z;printf(nentercomplexz1:);scanf(%f,%f,运行情况如下:nentercomplexz1:2,34,2z1+z2=6.00+5.00iz1*z2=2.00+16.00i,9.5.2用地址复制方式传送结构体变量指向结构体变量的指针可作为函数的形参,调用函数时对应的实参值是与形参属相同结构体类型的地址值。【例9.5】编程建立和显示全年级学生成绩册#include#defineMAXIMUM300structstudcharidnumber6;charname30;intscore;main()structstudstudentMAXIMUM;inti;for(i=0;iname);if(sp-name0=0)return(0);printf(idnumber:);gets(sp-idnumber);printf(score:);scanf(%d,9.7结构体嵌套结构体嵌套:某结构体成员又是一个结构体类型。注意:(1)从理论上讲嵌套的层次没有限制。(2)在嵌套定义中,内层结构体类型的定义必须在外层结构体类型的定义之前进行定义,否则在编译时会发生错误。变量的引用:由最内层的成员参与运算。【例9.6】对结构体嵌套成员的输入输出。#includestructdateintmonth,day,year;structaddresscharaddr20;longpostcode;longtel;,structpersonsintno;charname10;structdatebirthday;structaddressad;,main()structpersonsworker,*w;worker.no=1001;strcpy(worker.name,Wangyong);worker.birthday.month=12;worker.birthday.day=10;worker.birthday.year=1990;strcpy(worker.ad.addr,BeijingRoad1125);worker.ad.postcode=100222;worker.ad.tel=4567233;w=,9.8联合体,联合体:是一种构造数据类型,若干成员变量组成一个整体,不同于结构体的是成员变量公用一个起始地址(占相同的存储空间)一、联合体的定义联合体变量的定义和结构体变量的定义类似,先定义一种联合体模式,该模式用来定义联合体变量的样板或模式。定义形式:union联合体成员类型说明;,定义联合体时的关键字,标识符,对联合体中所有成员进行说明,成员类型是没有限制的,任何数据类型的变量都可以作为联合体的成员,包括结构体、数组和指针类型的变量。,Unionproductunsignedidnum;char*name;floatprice;intcount;,二、联合体变量的定义和引用:联合体模式一经定义后,就可以用它来定义相应的联合体变量。同结构体变量的定义类似,既可以在定义联合体模式的时候定义相应的联合体变量,也可以分别进行定义(定义完模式后再定义联合体变量)。联合体变量的定义的一般形式:union;是已定义的联合体模式是属于模式的一个或多个变量。如:unionproduct*pd;将联合体模式的定义和联合体变量的定义结合在一起:union联合体成员类型说明;,联合体变量成员的表示:.-如:pr.idnum表示pr的idnum成员pr.name表示pr的name成员pr.count表示pr的count成员pd-idnum表示pd指针的idnum成员pd-name表示pd指针的name成员,Unionproductunsignedidnum;char*name;floatprice;intcount;pr,*pd;,联合体变量的赋值:对联合体变量的操作是通过对联合体变量整体数据的操作,因而联合体变量主要是以成员的形式参与各种运算。这样,联合体变量的赋值主要是给联合体变量的各成员赋值。如:pr.idunm=1001;pr.name=“computer”;,由于联合体变量的各个成员共同使用一个存储单元,即联合体变量的所有成员具有相同的内存起始地址,因此,在给联合体变量各成员赋值是,只保留最近一次被赋值的成员值。在给某成员赋值后,原来被赋值过的成员的值将因被覆盖而丢失,也就没有意义了。注意:联合体变量的初值只能给一个成员赋值。,联合体的应用由于联合体的各个成员共同使用一个内存起始单元,使得其应用受到了很大的限制。但其比较适合解决从多个事件中选一个事件的情况,并且这些事件不会同时发生,即互斥事件,而这些事件又同时属于同一个联合体类型中的事件。,例9.12分析下面程序中联合体成员的引用操作#includeuniondatasfloatvalue;intnumber;charc3;main()uniondatasdata,*d;d=,printf(“%dn”,d-number);data.c0=a;printf(“%cn”,d-c0);,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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