欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    结构体、联合体.ppt

    • 资源ID:6599070       资源大小:226.16KB        全文页数:28页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    结构体、联合体.ppt

    第九章 结构体与联合体,9.1 结构体与结构体变量的定义 结构体是一种构造数据类型。数组也是构造数据类型,但数组要求其数组元素的数据类型必须是一致的,而在实际编程中要处理的大量复杂数据对象,其组成成员(元素)的数据类型往往是不一致的,这时我们就可以使用结构体类型来描述。一个学生的5门课程的成绩:float score5 一个学生的基本信息:学号、姓名、性别、成绩和生日。(5个数据是一个整体,但类型不一致)结构体:将不同类型的数据组织在一起,形成新的一种数据类型(9),9.1.1 结构体的定义 定义形式:struct 结构体成员类型说明;下面是定义了一个学生结构体数据类型:struct student unsigned int number;char*name;char sex;float score;,一个结构体的结构体成员类型是没有限制的,可以是C语言中任何类型的变量,可以是基本数据类型,也可以是构造类型,还可以是指针类型。当结构体成员也是结构体类型时,称之为结构体的嵌套,即一个结构体中可以包含另一个结构体的结构体变量。将上例中定义的学生结构体数据类型再加上一个出生日期结构体成员,可描述如下:,struct date/*date是结构体名,是一种类型而不是一个变量*/*day,month,year是结构体成员*/int day;int month;int year;struct student unsigned int number;char*name;char sex;float score;struct date birthday;/*结构体嵌套*/;,注意:(1)结构体是一种构造出来的数据类型。(2)结构体成员可以是任何数据类型。(3)使用结构体类型(结构体名)定义变量时应在结构体名前加struct关键字。,9.1.2 结构体变量的定义结构体变量定义形式:struct;例如:struct student d1,d2,*ps,d10;/*先定义一个结构体类型,再使用结构体定义结构体变量*/或struct student unsigned int number;char*name;char sex;float score;struct date birthday;d1,d2,*ps,d10;/*该定义把结构体的定义和结构体变量的定义合在一起,定义了两个结构体变量d1和d2,一个指向结构体变量的指针pd和一个一维结构体数组d。*/,用来指定该结构体变量所属的结构体模式,用来给出一个或多个结构体变量名,多个结构体变量名之间用逗号隔开,如果将结构体模式和结构体变量的定义合在一起,并且只进行一次结构体变量的定义,则可以省略结构体名,这样的结构体称为无名结构体。struct;例如:struct unsigned int number;char*name;float score;s1,*ps,ss50;,struct addrchar*addr;addr;,注意:(1)区别结构体名、结构体成员名和结构体变量名(2)三个名字可以相同(在三个不同的位置)(3)结构体变量占用的内存空间是各成员变量所占内存空间大小之和。,9.2 结构体类型变量的引用和初始化,9.2.1 结构体类型变量的引用 在对结构体变量引用时,一般只能对其成员进行直接操作,而不准许对结构体变量整体直接进行操作。也就是说,通过对结构体变量成员的访问操作达到对结构体变量整体的访问操作。结构体变量成员的两种引用形式:第一种形式:使用结构体成员运算符方式.d1.numberd1.named1.birthday.day(嵌套)“.”表示结构体成员变量的运算符,其结合性为从左至右。,第二种形式:通过指向结构体变量的指针表示结构体的成员(成员指针)-(*).ps-number(*ps).number,9.2.2 结构体类型变量的初始化结构体变量初始化:在定义结构体变量的同时,对其成员变量赋值struct=初始数据列表;初始数据列表中有多个数据项时,数据项之间用逗号隔开,初始数据列表中的数据个数要和结构体的成员个数相同,且对应数据要一致。struct student d1,d2=50403,”zhangsan”,m,86.5,3,12,1987例如,定义一个日期结构体类型变量。struct dateint day;int month;int year;struct date d1=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;例如:struct student d5;可以把结构体的定义和结构体数组的定义分开(如上面的方式),也可以合在一起定义,其定义形式为:struct;,struct student unsigned int number;char*name;char sex;float score;struct date birthday;d5;,9.3.2 结构体数组的初始化 结构体数组在定义的同时可以初始化。其初始化的一般形式就是将数组初始化与结构体变量的初始化相结合,即在结构体数据变量定义之后紧跟一个用花括号括起来的一组初始数据值:其格式如下:struct=初始数据值列表;或 struct=初始数据值列表;struct student d5=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】计算学生每门课的总成绩、平均成绩。#includestruct stu int number;char*name;float score2;struct stu students5=1001,Wangli,90,89,1002,Zhangyi,99,89,1003,Gaowei,85,93,1004,Chenjiang,97,88,1005,Lilin,82,98;main()int i;float aver1,aver2,sum1=0,sum2=0;for(i=0;i5;i+)sum1=sum1+studentsi.score0;sum2=sum2+studentsi.score1;aver1=sum1/5;aver2=sum2/5;printf(sum1=%f,sum2=%fn,sum1,sum2);printf(aver1=%f,aver2=%fn,aver1,aver2);,9.4 结构体指针,定义了的结构体变量后,系统就为相应的每一个结构体变量分配一段连续的存储单元,该存储单元中存放该结构体变量的各个成员。可见结构体变量是作为一个整体占用连续的存储单元,所以可以定义一个指针来指向它,指向其起始地址,这就是指向结构体的指针,即结构体指针。,9.4.1 结构体指针的定义结构体指针:指向结构体变量的指针,它是一个指针变量,而且其所指向的目标变量是一个结构体变量,指针值是结构体变量的首地址。结构体指针定义形式:struct 例如:struct student s,*ps=注意:(1)先定义结构体变量,而且结构体指针在使用之前必须通过初始化或赋值操作把某个结构体变量的首地址赋给他,使他指向该结构体变量。指针指向的应该是相同类型的结构体变量。(2)指针的运算含义与一般的指针相同(例如加1),9.4.2 用指向结构体的指针引用结构体成员struct student a,*ps=pb-number等价于(*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】给出下面程序的运行结果。struct ssint no;char*l;main()struct ss sv=1,Wang,2,Zhang;struct ss*q;q=sv;printf(%c,+*q-l);printf(%2d,(*q).no);printf(%2d,+q-no);printf(%2d,(+q)-no);printf(%2cn,*(q+)-l);,运行结果是:X 1 2 2 Z,【例9.3】建立一个结构体数组(设有5个元素),然后通过指针的方式对它输入数据,最后输出这些数据。程序中将数组元素的输入输出分别用两个函数来实现,为了便于对结构体数组的共享,将其定义为外部变量(全局变量)。#include struct mfchar name20;unsigned age;char sex7;struct mf person5,*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:20 male Ling Hong21 female Wang Hong,输出结果为:Ling Hong;20;maleWang Hong;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)istruct complexfloat real;float image;struct complex cadd(struct complex x,struct complex y)struct complex r;r.real=x.real+y.real;r.image=x.image+y.image;return(r);,struct complex mulitiply(struct complex x,struct complex y)struct complex r;r.real=x.real*y.real-x.image*y.image;r.image=x.real*y.image+x.image*y.real;return(r);main()struct complex z1,z2,z;printf(nenter complex z1:);scanf(%f,%f,运行情况如下:nenter complex z1:2,34,2z1+z2=6.00+5.00iz1*z2=2.00+16.00i,9.5.2 用地址复制方式传送结构体变量指向结构体变量的指针可作为函数的形参,调用函数时对应的实参值是与形参属相同结构体类型的地址值。【例9.5】编程建立和显示全年级学生成绩册#include#define MAXIMUM 300struct studchar idnumber6;char name30;int score;main()struct stud studentMAXIMUM;int i;for(i=0;iMAXIMUM;i+)if(input(,input(struct stud*sp)printf(nname:);gets(sp-name);if(sp-name0=0)return(0);printf(idnumber:);gets(sp-idnumber);printf(score:);scanf(%d,9.7 结构体嵌套结构体嵌套:某结构体成员又是一个结构体类型。注意:(1)从理论上讲嵌套的层次没有限制。(2)在嵌套定义中,内层结构体类型的定义必须在外层结构体类型的定义之前进行定义,否则在编译时会发生错误。变量的引用:由最内层的成员参与运算。【例9.6】对结构体嵌套成员的输入输出。#include struct dateint month,day,year;struct addresschar addr20;long postcode;long tel;,struct personsint no;char name10;struct date birthday;struct address ad;,main()struct persons worker,*w;worker.no=1001;strcpy(worker.name,Wangyong);worker.birthday.month=12;worker.birthday.day=10;worker.birthday.year=1990;strcpy(worker.ad.addr,Beijing Road 1125);worker.ad.postcode=100222;worker.ad.tel=4567233;w=,9.8 联合体,联合体:是一种构造数据类型,若干成员变量组成一个整体,不同于结构体的是成员变量公用一个起始地址(占相同的存储空间)一、联合体的定义联合体变量的定义和结构体变量的定义类似,先定义一种联合体模式,该模式用来定义联合体变量的样板或模式。定义形式:union 联合体成员类型说明;,定义联合体时的关键字,标识符,对联合体中所有成员进行说明,成员类型是没有限制的,任何数据类型的变量都可以作为联合体的成员,包括结构体、数组和指针类型的变量。,Union productunsigned idnum;char*name;float price;int count;,二、联合体变量的定义和引用:联合体模式一经定义后,就可以用它来定义相应的联合体变量。同结构体变量的定义类似,既可以在定义联合体模式的时候定义相应的联合体变量,也可以分别进行定义(定义完模式后再定义联合体变量)。联合体变量的定义的一般形式:union;是已定义的联合体模式是属于模式的一个或多个变量。如:union product*pd;将联合体模式的定义和联合体变量的定义结合在一起:union 联合体成员类型说明;,联合体变量成员的表示:.-如:pr.idnum表示pr的idnum成员pr.name表示pr的name成员pr.count表示pr的count成员pd-idnum表示pd指针的idnum成员pd-name表示pd指针的name成员,Union productunsigned idnum;char*name;float price;int count;pr,*pd;,联合体变量的赋值:对联合体变量的操作是通过对联合体变量整体数据的操作,因而联合体变量主要是以成员的形式参与各种运算。这样,联合体变量的赋值主要是给联合体变量的各成员赋值。如:pr.idunm=1001;pr.name=“computer”;,由于联合体变量的各个成员共同使用一个存储单元,即联合体变量的所有成员具有相同的内存起始地址,因此,在给联合体变量各成员赋值是,只保留最近一次被赋值的成员值。在给某成员赋值后,原来被赋值过的成员的值将因被覆盖而丢失,也就没有意义了。注意:联合体变量的初值只能给一个成员赋值。,联合体的应用由于联合体的各个成员共同使用一个内存起始单元,使得其应用受到了很大的限制。但其比较适合解决从多个事件中选一个事件的情况,并且这些事件不会同时发生,即互斥事件,而这些事件又同时属于同一个联合体类型中的事件。,例9.12分析下面程序中联合体成员的引用操作#includeunion datasfloat value;int number;char c3;main()union datas data,*d;d=,printf(“%dn”,d-number);data.c0=a;printf(“%cn”,d-c0);,

    注意事项

    本文(结构体、联合体.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开