第十章 结构体与联合体_第1页
第十章 结构体与联合体_第2页
第十章 结构体与联合体_第3页
第十章 结构体与联合体_第4页
第十章 结构体与联合体_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十章第十章 结构体与联合体结构体与联合体l结构体的定义、声明、初始化l结构体成员的访问l结构体变量的复制与比较l结构体与数组、函数l联合体概述l 问题:l一个变量可以表示一种数据类型的数据项。l一个数组可以表示一组相同类型的数据项。l如何表示一组不同类型的数据项呢?l 例如:如果我们需要保存以下信息作为一个信息整体:l一个大小为20的字符数组l一个整形数字l一个浮点型数字概述l 为满足以上应用需求,提出结构体的概念l结构体是一种机制l能够封装不同类型的数据l用于处理一组逻辑相关的数据项l以一种有意义的方法来组织复杂的数据l 联合体是一种特殊的结构体l为节省存储空间而存在l几乎没有什么应用机会

2、结构体的定义l 我们可以定义以下格式的结构体struct manchar job20;int old;float height;l 该结构体有3个数据字段,称为结构体成员l 每个成员可以属于不同的数据类型l man是结构体的名字,称为结构体标记符l 定义结构体以后,可以使用标记符来声明属于该结构体的变量结构体的定义l 结构体定义的格式如下:struct 结构体标记符数据类型成员变量1;数据类型成员变量2;l 注意:l结构体一般以分号结尾l整个结构体是一条语句l每个成员都有自己的名称和数据类型l结构体标记符可以在随后的程序中声明结构体变量声明结构体变量l 定义了结构体,就可以声明这种类型的变量l

3、 结构体变量的声明格式struct 结构体标记符 变量名1,变量名2;l 例:struct man LiangYe;l 结构体成员本身不是变量,定义结构体时不会它们分配存储空间l 当声明结构体变量时,将为结构体变量分配存储空间。声明结构体变量l 可以将结构体的定义与变量的声明结合在一起,例如:struct manchar job20;int old;float height; LiangYe;l 此时,结构体的名字可以省略,例如:structchar job20;int old;float height; LiangYe;访问结构体成员lLiangYe是一个结构体变量,它有多个成员,如何引用,

4、如何赋值呢?l在结构体中,变量与成员之间的关系使用成员运算符.来建立。l如:LiangYe.oldLiangYe.heightl对变量的成员赋值,可以使用LiangYe.old = 29;LiangYe.height = 1.80;访问结构体成员l 例:定义一个结构体,保存从键盘输入每个人的信息(姓名、参加工作时间、工资),保存在结构体中,然后输出。struct personalchar name20;int day;int month;int year;float salary;main()访问结构体成员struct personal person;scanf(“%s %d %d %d %f

5、”,,&person.day,&person.month,&person.year,&person.salary);printf(“%s %d %d %d %fn”,,person.day,person.month,person.year,person.salary);结构体的初始化l 结构体变量可以在编译时初始化l 例:main()structint weight;float height;student = 75, 1.80;l 成员与初始化值必须一一对应l 不允许在声明时初始化结构体的初始化l 初始化多个结构体变

6、量l 例:main()struct manint weight;float height; struct man student1 = 75, 1.80; struct man student2 = 75, 1.80;结构体的初始化l 初始化工作也可以在主函数外面进行l 例:struct manint weight;float height; student1 = 75, 1.80;main() struct man student2 = 75, 1.80;结构体变量的复制与比较l 结构体变量可以使用=进行复制l 例如:student1=student2;l 结构体变量不可以使用逻辑运算符进行

7、操作l 以下操作是错误的:student1!=student2;student1=student2;l 结构体的比较必须使用逐个成员分别比较的方法单个成员的运算l 结构体成员的运算与结构体成员的访问方法一样l 例如:LiangYe.old +=1;LiangYe.old +;结构数组l 我们使用以下结构体来表示一个人的属性struct manint old;float height;l 如果要表示多个人呢?l 我们可以声明一个结构体数组,例如:struct man student23;结构数组l 程序struct manint old;float height;main()struct man

8、 student2 = 18, 45, 19, 48结构数组举例struct marksint sub1;int sub2;int sub3;int total;main()int i;struct marks student3=67,78,89,0, 76,87,98,0, 84,72,94,0struct marks tatal;结构数组举例for (i = 0; i = 2; i+)studenti.total = studenti.sub1+ studenti.sub2+ studenti.sub3;total.sub1 += studenti.sub1;total.sub2 += s

9、tudenti.sub2;total.sub3 += studenti.sub3;total.total += studenti.total;结构体中的数组l 数组可以作为结构体的成员struct marksint sub3;int total;student2;l 可以使用student1.sub2;来表示第2个学生的第3科得分。结构体中的数组举例struct marksint sub3;int total;main()int i, j;struct marks student3=67,78,89,0, 76,87,98,0, 84,72,94,0struct marks tatal;for

10、 (i = 0; i = 2; i+)for (j = 0; j = 2; j+)studenti.total += studenti.subj;total.subj += studenti.subj;total.total += studenti.total;结构体中的结构体l 结构体可以嵌套,如我们声明一个结构体:struct salarychar name20;char department50;int basic_pay;int house_rent_allowance;int city_allowance;employee;结构体中的结构体l 我们可以重新声明一个嵌套的结构体:str

11、uct salarychar name20;char department50;int basic_pay;struct int house_rent;int city;allowance;employee;结构体中的结构体l 嵌套结构体的成员引用方法employee.allowance.house_rentemployee.allowance.cityl 非法引用employee.allowanceemployee.city结构体中的结构体l 可以使用标记符来定义内部结构体变量struct payint house_rent;int city;struct salarychar name20

12、;char department50; struct pay allowance;struct salary employee100;结构体与函数l C语言的精髓是函数的使用l 把结构体的值从一个函数传递给另一个函数的方法有:l把结构体的每个成员作为函数的实参进行传递l将结构体的副本传递给被调用函数l使用指针以参数形式来传递结构体l 方法2是最常用的方法之一l 调用形式为:函数名(结构体变量);l 被调用形式为:返回值类型 函数名 (结构体类型 结构体变量名);结构体与函数l 如果被调用函数的返回值是一个结构体,则对被调用函数声明时,其返回值类型应为struct+结构体标记符。l 做实参的结构

13、体变量与形参必须为相同的结构体类型。l 当返回值为结构体时,必须将它赋值给相同类型的结构体。结构体与函数举例struct storeschar name20;float price;int quantity;struct stores update (struct stores product, float p, int q)product.price +=p;product.quantity +=q;return product;结构体与函数举例main()float p_increment, value;int q_increment;struct stores item = “pen”,

14、 3.5, 10;scanf (“%f %d”, &p_increment, &q_increment);item = update(item, p_increment, q_increment);value = item.p_increment * p_increment.q_increment;printf(“%f”, item.price);printf(“%d”, item. quantity);printf(“%f”, value );联合体l 联合体是一种特殊形式的结构体,因此遵循与结构体相似的语法。l 联合体的定义格式:union itemint m;float x;char c;code;联合体l 联合体与结构体的区别是存储形式l 在结构体中,每个成员都有自己的存储空间l 在联合体中,所有成员使用相同的存储空间l 因此,联合体一次只能存储一个成员。l 联合体存储空间的大小,由占用空间最大的成员类型决定。l 在联合体中,当某个成员被赋予一个新值后,该值将替代掉前一个成员的值。l 例如以下将产生错误的输出:code.m = 279;code.x = 2344.56;printf(“%d”,code.m);l 因此,联

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论