




已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章结构体 结构体Whatarethey Whataretheygoodfor typedefI OStructs和函数 Structures 数组是由相同类型的数据构成如何才能将不同类型的数据组合在一起 Forexample 商店中CD的名字 歌唱家 价格黄页中的电话号码及主人名字学生的姓名 学号及成绩 Structures cont 某元素的成员个数固定 但数据类型不同需要将它们组织存储在一起可以使用结构体就像盒子手提箱杂物抽屉 Structures cont 在C中 结构体用struct标识它包含的成员个数固定 但数据类型可以不同 结构体类型的定义 structfriendStr charname MAXNAME longintphoneNumber charstreet MAXSTREET 结构体的名字name 结构体的各部分称为成员members 只是申明了结构体类型 但并未定义任何变量 CommonMistake structStudentRec charlastname MAXLEN floatmark 分号是结束标志 不能省略 结构体变量的定义 要在计算机内存中创建一个结构体 需要声明一个结构体变量 structfriendStrsarah 结构体变量名 结构体变量成员的引用 访问结构体成员 使用成员运算符 访问sarah的姓名 structfriendStr charname MAXNAME longintphoneNumber charstreet MAXSTREET structfriendStrsarah sarah namesarah phoneNumbersarah street 结构体变量成员的引用 结构体成员和普通变量一样使用如果是string 那它只是一个普通的string如果是int 那它只是一个普通的int唯一的区别在于要访问它们 既需要指定结构体名字 又需要指定成员名 sarah phoneNumber 55559999 strcpy sarah name SarahFinch strcpy sarah street FirthsmithSt 结构体变量成员的引用 structfriendStrsarah scanf s sarah name scanf ld structfriendStr charname MAXNAME longintphoneNumber charstreet MAXSTREET 结构体变量的初始化 structfriendStrsarah sarah SarahFinch 55559999 FirthsmithStreet structfriendStrsarah SarahFinch 55559999 FirthsmithStreet 结构体变量的初始化 structfriendStrsarah SarahFinch 55559999 FirthsmithStreet structfriendStrsusan susan sarah Examplewithstruct testing include defineMAXLEN50structStudentRec charlastname MAXLEN floatmark main structStudentRecstudA structStudentRecstudB Examplewithstruct testing printf EnterlastnameandmarkforstudentA scanf s f studA lastname DeclaringStructures cont 用 结构体名字 来应用结构体很是笨拙 structfriendStrsarah structfriendStrtony structfriendStrquinn structfriendStrgunalwan structfriendStrfong typedef 我们可以给结构体类型一个短点的名字 如 structfriendStr charname MAXNAME longintphoneNumber charstreet MAXSTREET typedefstructfriendStrfriend typedef cont 这样就可以在需要结构体变量friendStr的地方用friend来替代typedefstructfriendStrfriend friendsarah friendtony friendquinn friendgunalwan friendfong typedef cont 告诉编译器 每次看到friend 就把他理解为structfriendStr 如同使用符号常量 defineSIZE20 是告诉编译器 每次看到SIZE 就把他理解为20 typedef cont 一个更简洁地使用typedef的方法typedefstruct charname MAXNAME longintphoneNumber charstreet MAXSTREET friend structs的说明 结构体变量本身不能比较只能对其成员进行比较 if studA studB printf Duplicatedata n if strcmp studA lastname studB lastname 0 Examplewithtypedef testing include defineMAXLEN50structStudentRec charlastname MAXLEN floatmark typedefstructStudentRecStudent main StudentstudA StudentstudB Examplewithtypedef testing printf EnterlastnameandmarkforstudentA scanf s f studA lastname 7 1 3结构体数组 在实际应用中 经常用结构体数组来表示具有相同数据结构的一个群体 如 structstudent char pcNum char pcName charcSex structdate intnYear nMonth nDay dBirth floatfScore 结构体数组sStu 共有5个元素 sStu 0 sStu 4 在声明的时候还完成了对数组的初始化工作 structstudentsStu 5 0804101 Mr Zhang M 1979 9 1 80 0804102 Mr Wang W 1980 8 1 70 0804103 Mr Li M 1978 7 1 55 0804104 Mr Zhao W 1977 6 1 65 0804105 Mr Zhou M 1981 5 1 45 DeclaringStructureTypes 结构体的成员也可以是一个结构体类型 typedefstruct intNumOfStudents student infostudents 20 class info Examplewithtypedef 1 defineMAXLEN50 defineMAXN20structStudentRec charlastname MAXLEN floatmark typedefstructStudentRecStudent main intcount 0 Studentclass MAXN inti printf Howmanystudents scanf d if count MAXN printf Notenoughspace n exit 1 for i 0 i count i scanf s f class i lastname Examplewithtypedef 2 7 1 4结构体指针 结构体指针即结构体变量或数组的首地址 可以通过定义一个结构体指针变量 指向某个结构体变量或数组的首地址 结构体指针变量的定义有三种形式 结构体指针变量定义的三种形式 structstudent char pszNum char pszName charcSex structdate intnYear nMonth nDay dBirth floatfScore structstudent psStu structstudent char pszNum char pszName charcSex structdate intnYear nMonth nDay dBirth floatfScore psStu 结构体指针变量定义的三种形式 struct char pszNum char pszName charcSex structdate intnYear nMonth nDay dBirth floatfScore psStu 结构体指针变量定义的三种形式 结构体指针变量引用成员的方式 structstudent char pcNum char pcName charcSex structdate intnYear nMonth nDay dBirth floatfScore psStu sStu 0804101 Mr Zhang M 1979 9 1 80 psStu 使psStu指向sStu 结构体指针变量psStu指向了结构体变量sStu的首地址 即通过psStu可以实现操作sStu目的 指针变量名 成员名 指针变量名 成员名 结构体指针变量指向结构体数组 structtelephone charcName 20 charcPhone 10 structtelephonetTel 3 ptTel ptTel tTel 由于指针ptTel指向了数组tTel的首地址 则通过ptTel可以实现操作数组tTel元素的目的 例7 5运用结构体指针变量实现例7 3的功能 include defineNUM3structtelephone charcName 20 charPhone 10 main structtelephonetTel NUM ptTel for ptTel tTel ptTelcName printf inputphone gets ptTel cPhone for ptTel tTel ptTelcName ptTel cPhone PassingstructsasParameters 可以把结构体变量作为函数的参数Passingbyvalue传递struct 使用成员的值 但不改变它们Passingbyreference传递struct指针 可以修改成员的值 PassingastructbyValue 结构体变量作函数参数传递的是所有成员 voidprintRecord Studentitem printf name s n item lastname printf Mark 1f n n item mark main StudentstudentA Gauss 99 0 printRecord studentA 返回结构体变量 main StudentstudentA studentA readRecord StudentreadRecord void StudentnewStudent printf Enterlastnameandmark scanf s f newStudent lastname 结构体变量做函数的返回值 返回给主调函数的是所有成员 因此 接受此返回值的变量类型必须是结构体类型 传递structs指针 实际参数是struct的指针修改struct的成员对struct的成员的修改对主调函数和被调函数都可见 传递structs指针 cont voidreadStudent Student sptr printf PleaseenternameandID n scanf s sptr name scanf ld intmain StudentstudentA readStudent sptr 必须加 因为 比 的优先级别更高 传递structs指针 cont sptr 中括号是必须的e g sptr item求成员的地址 需要额外增加一对扩号e g sptr item Struct数组 每个数组元素都是一个完整的struct 包含了struct中的所有成员访问某成员的值 既需要指定数组的下标 也需要指定struct的哪个成员 e g studentList 0 namestudentList i id Arrayofstructs studentList Arrayofstructs studentList studentList 0 是整个的一个struct元素 Arrayofstructs studentList studentList 3 name是某struct元素的一个成员 Arraysofstructs defineMAXCLASS30typedefstruct longintid charname 20 Student Studentsem1Class MAXCLASS Arraysofstructs Studentsem1Class MAXCLASS inti for i 0 i MAXCLASS i printf entername n scanf s sem1Class i name printf enterid n scanf d 数组名字 Arraysofstructs Studentsem1Class MAXCLASS inti for i 0 i MAXCLASS i printf entername n scanf s sem1Class i name printf enterid n scanf d 数组下标 Arraysofstructs Studentsem1Class MAXCLASS inti for i 0 i MAXCLASS i printf entername n scanf s sem1Class i name printf enterid n scanf d 数组中的第i个struct元素 Arraysofstructs Studentsem1Class MAXCLASS inti for i 0 i MAXCLASS i printf entername n scanf s sem1Class i name printf enterid n scanf d 数组中的第i个struct元素的成员的名字 用结构体数组和指针访问结构体 某个Struct变量某个Struct变量的某个成员某个Struct变量的某个成员name的某个字符某个Struct变量的地址某个Struct指针所指向的变量的某个成员某个Struct指针所指向的变量的某个成员的地址 这个地址在结构体内部 typedefstruct intage charname 20 Child Childs 20 s 13 s 4 age s 7 name 3 s 2 sptr age sptr age Step by StepAnalysisoftheIndirectReference sptr age isevaluatedasshowninthefollowingtable include include defineMAXLEN50 defineMAXN20structStudentRec charlastname MAXLEN floatmark typedefstructStudentRecStudent voidreadStudent Student sptr printf Pleaseenternameandmark n scanf s sptr lastname parensneeded scanf f Example arrayofstructsandpass by reference 1 intmain intcount 0 Studentclass MAXN inti printf Howmanystudents scanf d Example arrayofstructsandpass by reference 2 间接成员操作运算符 上例中使用了直接成员操作符 e g sptr ageC还提供了间接成员操作运算符 e g sptr age sptr age 7 1 6位段 在定义结构体时以位为单位来声明成员所占的内存长度 这样的成员就称为位段或位域 C语言允许声明位段为从1 8范围内的任意位数 如 structbitdata unsigneda 2 unsignedb 5 unsignedc 3 unsignedd 2 bX 7 1 6位段 现在大家要特别注意 位段a和b共7位 不满一个字节 还剩1位 但紧接其后的位段c却需要3位 这时系统会另外起一个存储单元来存放位段c 依据同样的规律第二个存储单元也会出现3位空闲 如下图所示 7 2共用体 共用体又称联合体 是将不同数据类型组合在一起 这些不同类型的成员在内存中所占用的起始单元是相同的 7 2 1共用体类型定义 union共用体名 类型成员1 类型成员2 类型n成员n 例如 unionunit intnClass charcOffice 10 7 2 2共用体变量定义 共用体变量的声明和结构变量的定义方式一样 也有三种 共用体变量的赋值和引用 unionunit intnClass charcOffice 10 unionunituDepartment unionunit intnClass charcOffice 10 uDepartment union intnClass charcOffice 10 uDepartment 共用体变量名 成员名 使用共用体的基本原则 前面最近一次对这个共用体的赋值采样的是什么方式 把它当成哪个成员 现在取值也应该采样同样的方式 通过同样的成员的访问 取值使用 C语言只保证所有遵循这一规则的使用不会出错 对于不符合这个规则的使用 具体结果完全依赖于系统实现如果取值方式和前面赋值的方式不一致 语言定义没有规定将得到什么结果 使用共用体把一个正整型数据拆成高低两个字节的巧妙方法 main union unsignedintall unsignedcharb 2 test test all 0 xABCD printf x x n test b 0 test b 1 test b 0 为test all的低字节CD test b 1 为test all的高字节AB More main unionbt intk charc 2 a a k 7 printf o o n a c 0 a c 1 printf x x n a c 0 a c 1 printf d d n a c 0 a c 1 printf d d n sizeof a c 0 sizeof a c 1 printf c c n a c 0 a c 1 37777777771 37777777777fffffff9 ffffffff 7 11 1 7 7设有一张教师与学生通用的表格 数据项有姓名 年龄 职业 教研室 班级 输入人员数据 再以表格输出 include defineNUM2structinfo 结构体 charcName 10 intnAge charcJob unionunit 共用体 intnClass charcOffice 10 uDepa iPersonInfo NUM voidmain intnCount for nCount 0 nCount NUM nCount printf Name Age JobandClass Office n scanf s d c iPersonInfo nCount cName printf Name tAge tJob tClass Office n for nCount 0 nCount NUM nCount printf s t iPersonInfo nCount cName printf d t iPersonInfo nCount nAge printf c t iPersonInfo nCount cJob if iPersonInfo nCount cJob s printf d n iPersonInfo nCount uDepa nClass elseprintf s n iPersonInfo nCount uDepa cOffice 下述代码利用结构体类型 实现输入三个学生的学号 数学 语文 英语成绩 然后计算每位学生的总成绩以及平均成绩并按总分由大到小输出成绩表 请指出下列程序的错误 并予以更正 structstudent type charno 15 intmath chinese english total average main structstudent typestu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石大学前儿童保育学课外必读:中国居民膳食营养素参考摄入量表(DRIS)
- 2025年三年级寓言故事阅读试题
- SnO2-钛中空纤维电催化膜的制备及水处理性能研究
- 饮料行业客户细分与个性化服务策略-洞察阐释
- 专精特新小巨人企业的定义与行业定位
- 绿色园区的能源管理与低碳减排策略
- 建立产业协同机制促进跨界融合
- 新文科背景下传统文化类课程建设与实践
- 第七章运动和力教学设计
- 高中美术跨学科教学的现状与发展趋势
- CJJ129-2009 城市快速路设计规程
- 2022-2023学年安徽省马鞍山市八年级下期末数学试卷附答案解析
- 妇女节慰问单亲妈妈方案
- 木材家具研究报告-中国木材家具产业园区发展规划及招商引资咨询报告2024年
- MOOC 3D工程图学应用与提高-华中科技大学 中国大学慕课答案
- 医疗器械专业知识培训
- 起重培训课件
- 诊所消防安全培训课件
- 消防大队法律培训课件模板
- 过敏性皮炎大查房课件
- 产褥感染期护理查房
评论
0/150
提交评论