




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 程序设计 第4章 4 结构体 枚举类型 主要内容 结构体类型的定义结构体变量的定义结构体变量的使用结构体数组结构体中的静态成员位域 选读 共同体 选读 枚举类型的定义枚举变量的定义和使用 结构体类型的定义 结构体属于构造数据类型 数组是一组相同类型数据组成的集合体 结构体是若干个不同类型数据组成的集合体 结构体弥补了数组的不足 使得一个结构体数据可以包含多种类型的数据项 一个结构体类型由若干个不同类型的成员数据项组成 用一个类型名来命名 这样就可将这些不同类型的成员数据项作为一个整体来处理 例 描述学生的数据项有 学号 姓名 性别 成绩 可将这些不同类型的数据项作为一个整体来处理 定义一个名为student的数据类型 包括id name sex score四个成员数据项 那么student就是一个结构体类型 structstudent intid charname 10 charsex floatscore 结构体类型的定义 结构体类型的定义 struct结构体类型名 类型成员名1 类型成员名2 类型成员名n 此处分号不可缺少几点说明 结构体类型名 按标识符命名规则命名 注意 结构体类型是一种构造的数据类型 定义一个结构体类型 就是定义该结构体中成员的结构框架 编译系统不为任何数据类型分配存储空间 当然也不为结构体类型分配存储空间 结构体成员 花括号中依次列出组成该结构体类型的各个成员 并对各成员进行类型声明 成员的类型可以是C 中任意基本数据类型 也可以是已定义的构造数据类型 注意 声明成员时 不能指定其存储类型为 auto register extern 因为系统并不为结构体类型分配存储空间 但可以指定成员的存储类型为static 关于结构体中static静态成员的作用本章后续介绍 结构体变量的定义 结构体变量的定义 格式1 存储类型 结构体类型名变量名1 变量名2 格式2 存储类型 struct结构体类型名变量名1 变量名2 几点说明 存储类型有auto static register extern四种 当存储类型省略时 对于局部结构体变量 表示auto 定义结构体变量时 系统按结构体类型中的成员框架为其分配一段连续的存储空间 依次存放各个成员的数据 所占内存的字节数为各个成员所占字节数之和 结构体变量的作用域与一般变量的作用域相同 全局结构体变量具有文件作用域 局部结构体变量具有块作用域 结构体变量的生存期也与一般变量的生存期相同 全局结构体变量 static静态局部结构体变量存放在静态区 auto局部结构体变量存放在栈区 结构体变量的定义 定义结构体变量的方法有三种 先定义结构体类型 再定义结构体类型的变量 定义结构体类型的同时 紧跟着定义结构体类型的变量 定义无名的结构体类型 并同时定义结构体类型的变量 例 includestructperson intid charname 10 structdate intyear intmonth intday d1 定义结构体类型的同时 紧跟着定义其变量 struct inthour 无名结构体类型intminute intsecond t1 t2 定义无名结构体类型 并同时定义其变量 personp1 p2 先定义结构体类型 再定义结构体变量 结构体变量的使用 结构体变量的初始化 与数组类同 在定义结构体变量时 用花括号将每一个成员的初值括起来赋给该变量 注意 花括号中列出初值其类型和顺序必须与结构体类型定义中所声明的成员一一对应 例 students1 408001 张小笑 F 98 结构体变量成员的引用 使用成员运算符 结构体变量名 成员名几点说明 同类型的结构体变量之间可以相互赋值 这种赋值等同于各个成员的依次赋值 结构体变量不能直接进行输入 输出 它的每一个成员能否直接进行输入 输出 取决于其成员的类型 若是基本数据类型或字符数组 则可以直接进行输入 输出 例 include includestructstudent intid charname 10 charsex floatscore voidmain students1 408001 张小笑 m 98 cout s2 id s2 name s2 sex s2 score cout s2 s2 id t s2 name t s2 sex t s2 score endl s3 s2 cout s3 s3 id t s3 name t s3 sex t s3 score endl s3 id 408003 strcpy s3 name 王嘻嘻 cout s3 s3 id t s3 name t s3 sex t s3 score endl 运行 s1 408001张小笑m98请输入学号 姓名 性别 m f 成绩 408002王哈哈f88 s2 408002王哈哈f88s3 408002王哈哈f88s3 408003王嘻嘻f88 结构体变量的使用 结构体中成员的类型可以是C 中任意基本数据类型 也可以是已定义的构造数据类型 因此当然可以是已定义的结构体类型 当要访问嵌套在内层的结构体成员时 同样使用成员运算符 来实现 例 includestructdate intyear intmonth intday structstudent intid charname 10 charsex datebirthday floatscore voidmain students 408001 张小笑 m 1991 5 15 98 cout s id t s name t s sex t s birthday year t cout s birthday month t s birthday day t s score endl 运行 408001张小笑m199151598 结构体变量的使用 结构体变量与一般变量一样 可以作为函数的参数 同样结构体类型也可以作为函数返回值的类型 例 includestructcomplex floatreal image 定义一个表示复数的结构体类型voidswap1 complexc1 complexc2 complext t c1 c1 c2 c2 t voidswap2 complex voidmain complexc1 5 7 c2 3 2 c3 cout c1 c1 real c1 image i n cout c2 c2 real c2 image i nn swap1 c1 c2 cout c1 c1 real c1 image i n cout c2 c2 real c2 image i n n swap2 c1 c2 cout c1 c1 real c1 image i n cout c2 c2 real c2 image i n n c3 add c1 c2 cout c3 c3 real c3 image i n 运行 c1 5 7i c2 3 2i c1 5 7i c2 3 2i c1 3 2i c2 5 7i c3 8 9i 结构体数组 结构体数组 数组是一组相同类型的元素组成的集合体 而数组元素的类型当然可以是已定义的结构体类型 这种由结构体变量组成的数组称为结构体数组 例 结构数组 includestructstudent intid charname 10 charsex 4 floatscore voidinput student voidsort students intn inti j studentt for i 0 i n 1 i for j i 1 j n j if s i score s j score t s i s i s j s j t voidmain inti students 4 for i 0 i 4 i input s i cout 排序前 n for i 0 i 4 i output s i sort s 4 cout 排序后 n for i 0 i 4 i output s i 例 有三位侯选人 输入各张选票上得票人的名字 统计出各人的得票数 include includestructperson charname 10 intcount voidmain inti charname 10 personleader 3 王哈哈 0 肖嘻嘻 0 乐咪咪 0 cout name while strcmp name 0 0 for i 0 i name cout 统计结果 n for i 0 i 3 i cout leader i name leader i count t t cout endl 运行 请输入得票人姓名 输入0结束 王哈哈肖嘻嘻肖嘻嘻王哈哈肖嘻嘻肖嘻嘻乐咪咪王哈哈肖嘻嘻王哈哈乐咪咪肖嘻嘻肖嘻嘻乐咪咪王哈哈肖嘻嘻0 统计结果 王哈哈 5肖嘻嘻 8乐咪咪 3 结构体中的静态成员 结构体中的静态成员 若将结构体类型中某个成员的存储类型定义为static静态成员 则对于这种结构体类型的所有变量 编译程序只为该static成员分配一个存储空间 即这种结构体类型的所有变量共享该static成员的存储空间 在结构体类型中声明static成员是属于引用性声明 必须在文件作用域的某一个地方对static成员进行一次且仅能一次的定义性声明 对结构体类型中的静态成员进行定义性声明的格式 类型结构体类型名 静态成员名 该声明语句的作用是为该静态成员分配存储空间 可同时为其赋初值 若未赋初值 其初值为0 指向结构体的指针 结构体的指针 在创建结构体变量时 编译系统会为每一个结构体变量分配一定的存储空间 以存放其成员数据 结构体变量空间的起始地址就是结构体的指针 指向结构体的指针变量的定义 存储类型 结构体类型名 指针变量名 结构体起始地址 通过结构体指针引用结构体中的public成员 格式1 通过指针成员运算符 结构体指针 成员名 格式2 通过点成员运算符 结构体指针 成员名 例 includestructstudent intid charname 10 floatscore voidmain students 408001 张小笑 98 student p 运行 s 408001张小笑98s 408001张小笑98s 408001张小笑98 例 结构体中的static静态成员 includestructstudent intid charname 10 charsex 4 floatscore staticintcount 静态成员 引用性声明 intstudent count 3 静态成员 定义性声明voidmain students1 s2 cout s1 s1 count endl cout s2 s2 count endl s2 count 6 cout s1 s1 count endl cout s2 s2 count endl 运行 366 位域 选读 位域 位域 指在一个字或字节中 用若干个二进制位来建立若干个标志位 一个标志用0或1来表示 具体作法是将一个字或一个字节根据需要划分成若干个位域 位域的定义 就是定义一个结构体类型 在结构体类型中指定每一个成员占用的二进制位数 即位域 一个位域成员的长度不能大于一个字的长度 位域类型的定义 struct结构体类型名 unsigned位域名1 二进制位数 unsigned位域名2 二进制位数 unsigned位域名n 二进制位数 此处分号不可缺少 位域 选读 几点说明 位域名按标识符命名规则命名 位域的成员类型必须是无符号整型 一个结构体类型中定义的任何一个位域都必须在同一个字中 若本字中剩余的二进制位数不够定义一个位域时 则该字的剩余二进制位不用 而从下一个字开始 若需要跳过某些不用的二进制位 也可定义一个无名的位域 例 structdata unsignedflag1 2 unsignedflag2 4 unsigned 2 无名位域 跳过2个不用的二进制位unsignedflag3 6 unsignedflag4 2 位域 选读 位域变量的定义 等同于结构体变量的定义 格式1 存储类型 结构体类型名变量名1 变量名2 格式2 存储类型 struct结构体类型名变量名1 变量名2 位域变量的使用 等同于结构体变量的使用 同类型的位域变量之间可以相互赋值 这种赋值等同于各个成员的依次赋值 位域变量与结构体变量一样 也可以作为函数的参数 位域变量不能直接进行输入 输出 位域变量的每个成员都是作为一个整型变量来使用 但是其取值范围受到指定给其的二进制位数限制 若所赋的值大于该成员所能表示的范围 超过的高位部分被舍弃 即按取模后的数存入该成员 使用位域的目的是节省内存空间 但存取位域变量值时所花费的时间较多 若内存足够大 使用位域就没有意义了 位域变量主要用于系统程序设计中 例 位域 include includestructdata unsignedf1 2 unsignedf2 4 unsigned 2 unsignedf3 6 unsignedf4 2 voidmain datad1 d2 d1 f1 5 d1 f2 5 d1 f3 0 x3f d1 f4 3 cout d1 setw 10 d1 f1 setw 10 d1 f2 cout setw 10 d1 f3 setw 10 d1 f4 cout t t字节数 sizeof d1 endl d2 d1 cout d2 setw 10 d2 f1 setw 10 d2 f2 cout setw 10 d2 f3 setw 10 d2 f4 cout t t字节数 sizeof d2 endl 运行 d1 15633字节数 4d2 15633字节数 4 共同体 选读 共同体 联合体 属于构造数据类型 指将不同类型的变量组织成一个整体 利用内存覆盖技术 使它们在内存中共用同一段存储区域 共同体与结构体区别 结构体变量所占内存长度是各成员所占内存长度之和 各成员独自占有自己的内存区域 而共同体变量所占内存长度是其最长成员的长度 各成员共用同一段内存区域 共同体类型的定义 union共同体类型名 类型成员名1 类型成员名2 类型成员名n 此处分号不可缺少说明 对结构体类型所作的说明也适用于共同体 共同体 选读 共同体变量的定义 雷同于结构体变量的定义 格式1 存储类型 共同体类型名变量名1 变量名2 格式2 存储类型 union共同体类型名变量名1 变量名2 共同体变量的使用 一个共同体变量中的所有成员共用同一段内存区域 共同体变量所占内存区域的大小由占用最大内存区域的成员所决定 任一时刻 一个共同体变量中只能有一个成员起作用 定义共同体变量时不能对其进行初始化 使用共同体的目的是节省内存空间 现在内存越来越大 通常的程序设计中已较少使用 共同体主要用于计算机底层的程序设计中 共同体变量成员的引用 使用成员运算符 共同体变量名 成员名 例 共同体 include includeuniondata chara intb shortm floatn voidmain datad d b 39000 cout 各成员值 setw 4 d a setw 12 d b cout setw 12 d m setw 20 d n endl d a A cout 各成员值 setw 4 d a setw 12 d b cout setw 12 d m setw 20 d n endl cout 字节数 sizeof d t首地址 int 运行 各成员值 X39000 265365 46506e 041各成员值 A38977 265595 46184e 041字节数 4首地址 1245052a地址 1245052b地址 1245052c地址 1245052d地址 1245052 枚举类型的定义 枚举类型属于构造数据类型 如果一个变量仅有几种可能的取值 可以定义为枚举类型的变量 在定义枚举类型的变量之前 必须先定义枚举类型 枚举类型是指将可能的取值一一列举出来 对于该枚举类型的变量 其取值仅限于列举出来的范围内 枚举类型是为了一些具有特殊 离散 值域的数据而引入的 例 对于取值于 星期几 的数据 可定义一个名为weekday的数据类型 该类型的变量取值仅限于sun mon tue wed thu fri sat七个中的一个 那么weekday就是一个枚举类型 enumweekday sun mon tue wed thu fri sat weekdayw1 mon w1是weekday类型的变量weekdayw2 sat w2是weekday类型的变量 枚举类型的定义 枚举类型的定义 enum枚举类型名 枚举常量1 枚举常量2 枚举常量n 几点说明 枚举常量 枚举元素 是以标识符形式表示的整型量 不是字面常量 各枚举常量代表该枚举类型变量的可能取值 它们之间以 分隔 编译器为每个枚举常量指定一个内部整数值 默认状态下 这个整数值就是列举时的顺序号 序号从0开始 按列举顺序依次为 0 1 2 3 例 enumcolor red yellow blue black white 则枚举常量red yellow blue black white的值分别是 0 1 2 3 4 枚举类型的定义 定义枚举类型时 也可为部分或全部的枚举常量另行指定整数值 而对于具有指定值后面那些无指定的枚举常量 则按依次加1的原则取值 注意 各枚举常量的整数值可以相同 但各枚举常量的标识符必须不同 例 enumweekday sun 7 mon 1 tue wed thu fri sat 则枚举常量sun mon tue wed thu fri sat的值分别是 7 1 2 3 4 5 6 例 enumfruit apple orange banana peach 1 grape 则枚举常量apple orange banana peach grape的值分别是 0 1 2 1 2 定义枚举类型的主要目的是增加程序的可读性 枚举类型最常见的用途之一就是用来描述状态量 枚举变量的定义和使用 枚举变量的定义 格式1 存储类型 枚举类型名变量名1 变量名2 格式2 存储类型 enum枚举类型名变量名1 变量名2 几点说明 存储类型有auto static register extern
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧餐饮超算系统创新创业项目商业计划书
- 水果风味调味酱创新创业项目商业计划书
- 坚果产业绿色发展创新奖创新创业项目商业计划书
- 2025年美发师中级练习题(含答案解析)
- 2025年反洗钱知识竞赛题库及参考答案
- 土估课件教学课件
- 图表说明比较说明课件
- 2025年特殊工种试卷及答案
- 电商直播基地2025年新媒体营销策略研究报告
- 2025年建筑电焊工考试题含答案
- 清洗地毯操作流程课件
- 第3章-微波与卫星通信课件
- 系统硬件-通信模块741-s使用手册
- 球磨机试车方案
- 四年级上册数学单元测试-8.垂线与平行线 苏教版 (含解析)
- 中药的煎煮方法课件
- 流动机械安全专项方案
- 医院患者有自杀倾向时应急预案及处理流程
- 汽车材料(第三版)整套课件汇总完整版电子教案(全)
- 古今滑稽诗话 稽山范范左青编
- 第二章纯金属的结晶
评论
0/150
提交评论