




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章 结构体与联合体,结构体的定义、声明、初始化 结构体成员的访问 结构体变量的复制与比较 结构体与数组、函数 联合体,概述,问题: 一个变量可以表示一种数据类型的数据项。 一个数组可以表示一组相同类型的数据项。 如何表示一组不同类型的数据项呢? 例如:如果我们需要保存以下信息作为一个信息整体: 一个大小为20的字符数组 一个整形数字 一个浮点型数字,概述,为满足以上应用需求,提出结构体的概念 结构体是一种机制 能够封装不同类型的数据 用于处理一组逻辑相关的数据项 以一种有意义的方法来组织复杂的数据 联合体是一种特殊的结构体 为节省存储空间而存在 几乎没有什么应用机会,结构体的定义,我们可以
2、定义以下格式的结构体 struct man char job20; int old; float height; ; 该结构体有3个数据字段,称为结构体成员 每个成员可以属于不同的数据类型 man是结构体的名字,称为结构体标记符 定义结构体以后,可以使用标记符来声明属于该结构体的变量,结构体的定义,结构体定义的格式如下: struct 结构体标记符 数据类型 成员变量1; 数据类型 成员变量2; ; 注意: 结构体一般以分号结尾 整个结构体是一条语句 每个成员都有自己的名称和数据类型 结构体标记符可以在随后的程序中声明结构体变量,声明结构体变量,定义了结构体,就可以声明这种类型的变量 结构体变
3、量的声明格式 struct 结构体标记符 变量名1,变量名2; 例: struct man LiangYe; 结构体成员本身不是变量,定义结构体时不会它们分配存储空间 当声明结构体变量时,将为结构体变量分配存储空间。,声明结构体变量,可以将结构体的定义与变量的声明结合在一起,例如: struct man char job20; int old; float height; LiangYe; 此时,结构体的名字可以省略,例如: struct char job20; int old; float height; LiangYe;,访问结构体成员,LiangYe是一个结构体变量,它有多个成员,如何引
4、用,如何赋值呢? 在结构体中,变量与成员之间的关系使用成员运算符.来建立。 如: LiangYe.old LiangYe.height 对变量的成员赋值,可以使用 LiangYe.old = 29; LiangYe.height = 1.80;,访问结构体成员,例:定义一个结构体,保存从键盘输入每个人的信息(姓名、参加工作时间、工资),保存在结构体中,然后输出。 struct personal char name20; int day; int month; int year; float salary; main(),访问结构体成员, struct personal person; scan
5、f(“%s %d %d %d %f”, , float height; student = 75, 1.80; 成员与初始化值必须一一对应 不允许在声明时初始化,结构体的初始化,初始化多个结构体变量 例: main() struct man int weight; float height; ; struct man student1 = 75, 1.80; struct man student2 = 75, 1.80; ,结构体的初始化,初始化工作也可以在主函数外面进行 例: struct man int weight; float height; student1 =
6、 75, 1.80; main() struct man student2 = 75, 1.80; ,结构体变量的复制与比较,结构体变量可以使用=进行复制 例如: student1=student2; 结构体变量不可以使用逻辑运算符进行操作 以下操作是错误的: student1!=student2; student1=student2; 结构体的比较必须使用逐个成员分别比较的方法,单个成员的运算,结构体成员的运算与结构体成员的访问方法一样 例如: LiangYe.old +=1; LiangYe.old +;,结构数组,我们使用以下结构体来表示一个人的属性 struct man int old
7、; float height; ; 如果要表示多个人呢? 我们可以声明一个结构体数组,例如: struct man student23;,结构数组,程序 struct man int old; float height; ; main() struct man student2 = 18, 45, 19, 48 ,结构数组举例,struct marks int sub1; int sub2; int sub3; int total; ; main() int i; struct marks student3=67,78,89,0, 76,87,98,0, 84,72,94,0 struct m
8、arks tatal; ,结构数组举例,for (i = 0; i = 2; i+) studenti.total = studenti.sub1+ studenti.sub2+ studenti.sub3; total.sub1 += studenti.sub1; total.sub2 += studenti.sub2; total.sub3 += studenti.sub3; total.total += studenti.total; ,结构体中的数组,数组可以作为结构体的成员 struct marks int sub3; int total; student2; 可以使用 studen
9、t1.sub2; 来表示第2个学生的第3科得分。,结构体中的数组举例,struct marks int sub3; int total; ; main() int i, j; struct marks student3=67,78,89,0, 76,87,98,0, 84,72,94,0 struct marks tatal; ,for (i = 0; i = 2; i+) for (j = 0; j = 2; j+) studenti.total += studenti.subj; total.subj += studenti.subj; total.total += studenti.to
10、tal; ,结构体中的结构体,结构体可以嵌套,如我们声明一个结构体: struct salary char name20; char department50; int basic_pay; int house_rent_allowance; int city_allowance; employee;,结构体中的结构体,我们可以重新声明一个嵌套的结构体: struct salary char name20; char department50; int basic_pay; struct int house_rent; int city; allowance; employee;,结构体中的结
11、构体,嵌套结构体的成员引用方法 employee.allowance.house_rent employee.allowance.city 非法引用 employee.allowance employee.city,结构体中的结构体,可以使用标记符来定义内部结构体变量 struct pay int house_rent; int city; ; struct salary char name20; char department50; struct pay allowance; ; struct salary employee100;,结构体与函数,C语言的精髓是函数的使用 把结构体的值从一个
12、函数传递给另一个函数的方法有: 把结构体的每个成员作为函数的实参进行传递 将结构体的副本传递给被调用函数 使用指针以参数形式来传递结构体 方法2是最常用的方法之一 调用形式为: 函数名(结构体变量); 被调用形式为: 返回值类型 函数名 (结构体类型 结构体变量名);,结构体与函数,如果被调用函数的返回值是一个结构体,则对被调用函数声明时,其返回值类型应为struct+结构体标记符。 做实参的结构体变量与形参必须为相同的结构体类型。 当返回值为结构体时,必须将它赋值给相同类型的结构体。,结构体与函数举例,struct stores char name20; float price; int q
13、uantity; ; 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”, 3.5, 10; scanf (“%f %d”, ,联合体,联合体是一种特殊形式的结构体,因此遵循与结构体相似的语法。 联合体的定义格式: union item int m; float x; char c; code;,联合体,联合体与结构体的区别是存储形式 在结构体中,每个成员都有自己的存储空间 在联合体中,所有成员使用相同的存储空间 因此,联合体一次只能存储一个成员。 联合体存储空间的大小,由占用空间最大的成员类型决定。,在联合体中,当某个成员被赋予一个新值后,该值将替代掉前一个成员的值。 例如以下将产生错误的输出: code.m = 279; code.x = 2344.56; printf(“%d”,code.m); 因此,联合体初始化时,只能对第一个成员进行初始化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年矿山无人作业技术在矿山环境监测中的应用与发展研究报告
- 乡村医生录用管理办法
- 企业科研预言管理办法
- 产品追溯标识管理办法
- 乡村规划建设管理办法
- 云南诊所备案管理办法
- 临朐农贸市场管理办法
- 人员教育培训管理办法
- 企业上市咨询管理办法
- 公司产品条码管理办法
- 环境科学与工程专业英语翻译第三版钟理
- JJF 1015-2014计量器具型式评价通用规范
- GB/T 8332-2008泡沫塑料燃烧性能试验方法水平燃烧法
- GB/T 20330-2006攻丝前钻孔用麻花钻直径
- GB/T 18033-2017无缝铜水管和铜气管
- 输血反应的发生及防治
- 湖北省仙桃市各县区乡镇行政村村庄村名居民村民委员会明细
- 中粮集团朝阳大悦城招商手册
- 钢板仓施工方案
- pcba检验标准最完整版
- 北京福赛尔V6891、V6851控制器(联动型)的调试
评论
0/150
提交评论