C语言计算机二级结构体和共用体.ppt

上传人:max****ui 文档编号:8622051 上传时间:2020-03-30 格式:PPT 页数:49 大小:391.55KB
返回 下载 相关 举报
C语言计算机二级结构体和共用体.ppt_第1页
第1页 / 共49页
C语言计算机二级结构体和共用体.ppt_第2页
第2页 / 共49页
C语言计算机二级结构体和共用体.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
第8章结构体和共用体 学习目标 掌握结构体类型 结构体变量 结构体数组的定义掌握结构体变量指针 结构体数组元素指针等基本概念掌握结构体指针的声明 初始化 赋值及引用了解共用体类型的定义 共用体变量的声明 赋值及使用了解枚举类型的定义 枚举类型变量的声明 赋值及使用理解typedef的功能 8 1结构体 数组中各元素是属于同一个类型 若要将不同类型的数据组合成一个有机的整体 例如 姓名 年龄 性别 成绩组合为一个组合项 C用结构体来建立这种数据结构 8 1 1结构体类型 一个结构体类型可以由若干个被称为成员 或域 的成分组成 每个成员具有自身的名字和数据类型 同一结构中的成员名不能相同 例如一个学生的信息 它包括以下5项 1 学号 用5位数字表示 长整型 2 姓名 用汉语拼音表示 最多20个字符 3 性别 用M或F表示 分别表示男或女 4 生日 如19881015 表示年月日 5 地址 用字符数组表示 最多30个字符 8 1 2结构体类型的声明 一个结构体类型的一般形式为 struct结构体名 类型名1成员名1 类型名2成员名2 类型名n成员名n 例如 structstu longintnum 学号 charname 20 姓名 charsex 性别 unsignedlongbirthday 生日 charaddr 30 地址 说明 1 结构体声明描述了结构体的组织形式 但在编译时并不为它分配存储空间 2 结构体的成员可以是简单变量 数组 指针 结构体或共用体等 3 结构体不可嵌套定义 但可以嵌套使用 例如 structdate intday charmonth 4 intyear structstudent longintnum charname 20 charsex structdatebirthday 结构体成员是另一种结构类型 结构体在此嵌套 char addr 嵌套结构体student的逻辑结构 4 结构体声明可以在函数内部 也可以在函数外部 5 定义结构体类型时 注意不能遗漏最后的分号 8 1 3结构体变量 一 结构体变量的定义可以采取以下三种方法定义结构体类型变量 1 在声明结构体类型的同时定义变量 例如 structstudent longintnum charname 20 charsex intage floatscore s1 s2 s3 声明结构体类型的同时定义结构体变量的一般形式为 struct结构体名 类型名1成员名1 类型名2成员名2 类型名n成员名n 变量名 变量名 变量名m 特点 定义一次结构体变量之后 在该定义之后的任何位置仍可用该结构体类型来定义其它结构体变量 2 直接定义结构类型变量例如 struct longintnum charname 20 charsex intage floatscore stu1 stu2 stu3 直接定义结构体变量的一般形式为 struct 类型名1成员名1 类型名2成员名2 类型名n成员名n 变量名 变量名 变量名m 特点 由于在struct后不出现结构体名 故不便于在源程序的其他地方定义该类型的新变量 3 先声明结构体类型再定义变量名例如 structstudent longintnum charname 20 charsex intage floatscore structstudentstu1 stu2 stu3 一般形式为 struct结构体名 类型名1成员名1 类型名2成员名2 类型名n成员名n struct结构体名变量名 变量名 变量名m 特点 在该定义之后的任何位置 不仅可用该结构体类型来定义其他结构体变量 而且可把其结构体声明部分作为文件存放起来 这样就可借助于include命令把它复制到任何源文件中 用以定义同类型的其它结构体变量 注意 1 定义一定要在结构体声明之后或与结构体声明同时进行 对尚未声明的结构体类型 不能用它来定义结构体变量 2 存储空间分配是按照其对应的各成员项的定义顺序进行的 3 同一结构类型的每个结构体变量 存储空间的大小都相同 是各成员项所占空间之和 例如 sizeof stu1 的值为31 sizeof structstudent 的值为31 sizeof float 的值为4 4 结构体变量中的成员可以单独使用 地位与一般变量相同 5 结构体变量一般不用register型 二 结构体变量的初始化 structstudent longintnum charname 20 charsex charaddr 20 stu1 stu2 89031 Lilin M 123BeijingRoad 结构体变量stu2初始化 三 结构体变量的引用 形式 结构体变量名 成员名 includevoidmain structstudent longintnum charname 20 charsex charaddr 20 stu1 stu2 89031 Lilin M 123BeijingRoad 结构体变量stu2初始化 printf NO ld nname s nsex c naddress s n stu2 num stu2 name stu2 sex stu2 addr stu1 stu2 两个相同类型的结构体变量之间可以进行赋值操作 printf NO ld nname s nsex c naddress s n stu1 num stu1 name stu1 sex stu1 addr 注意 1 不能将一个结构体变量作为一个整体进行输入和输出 例 scanf ld s c s 4 如果成员本身又属一个结构体类型 则要逐级地找到最低的一级成员 只能对最低级的成员进行存取 8 2结构体数组 8 2 1结构体数组的定义 1 定义结构体类型后定义结构数组 例如 structstudent longintnum charname 20 charsex intage floatscore structstudentstu 5 2 直接定义一个结构数组 例如 structstudent longintnum charname 20 charsex intage floatscore stu 5 或struct longintnum charname 20 charsex intage floatscore stu 5 8 2 2结构数组的初始化 格式 struct结构体名结构数组名 元素个数 初始数据 structstudentstu 3 80101 Lilin M 18 80102 Wanglan F 19 80103 Zhangjun F 20 structstudentstu 80101 Lilin M 18 80102 Wanglan F 19 80103 Zhangjun F 20 structstudent longintnum charname 20 charsex intage stu 80101 Lilin M 18 80102 Wanglan F 19 80103 Zhangjun F 20 8 2 3结构数组元素的引用 形式 结构体数组名 下标 成员名例如stu 0 num 80101 strcpy stu 0 name Lilin 例 统计全班男女生人数及1990年以后 含1990年 出生的人数 include string h include stdio h voidmain structstud 定义一个结构stud 包含3个成员 charname 20 姓名 charsex 性别 intyear 出身年份 structstudclass 100 定义一个结构数组class intm num 0 f num 0 total90 0 class num i printf Pleaseenterclass num scanf d for i 0 i 1990 total90 统计90以后出生的人数 printf nnumberofboy d m num printf nnumberofgirl d f num printf nnumberafterof1990 d total90 测试数据与运行结果 输入 Pleaseenterclass num 3 Pleaseentername sex year Zhanglinm1988 Pleaseentername sex year Wangpinf1990 Pleaseentername sex year LiutaoM1989 输出 Zhanglinm1988Wangpinf1990LiutaoM1989numberofboy 2numberofgirl 1numberafterof1990 1 8 3结构指针 8 3 1指向结构体变量的指针形式 struct结构体名 结构指针名 例 staticstructstudent p 结构指针在定义时也可以初始化 例 structstudent longintnum charname 20 charsex intage floatscore stu1 p 用指针引用结构体成员的一般形式 结构指针名 成员名或结构指针名 成员名设有类型 变量声明及初始化如下 structdate intday charmonth 4 intyear birthday sp 则 sp day sp month sp day sp month均是合法 其中 sp day和sp day等效 sp month和sp month等效 例 include stdio h include string h voidmain structstud char num charname 20 floatscore structstudstu1 sp sp 注意 1 sp两侧的括号不可省 因为成员运算符 优先于 运算符 sp num就等价于 sp num 了 2 由于运算符 和 的优先级最高 其结合性相同 例如 sp num等价于 sp num 即成员值加1 sp num 先执行sp sp 1 再执行sp num 注意sp的值已经改变 sp num或 sp num 先存取sp num 再执行sp sp 1 sp num 先存取sp num 再使成员值加1 8 3 2指向结构数组的指针 includestructstudent longintnum charname 20 charsex intage stu 3 80101 Lilin M 18 80102 Yanglan F 19 80103 Zhangjun F 20 voidmain structstudent p p是指向structstudent型数据的指针变量 printf nNo tName t tsex tage n for p stu pnum p name p sex p age 运行结果 No Namesexage80101LilinM1880102Yanglan 1980103Zhangjun 20 8 3 3结构体变量做函数参数 1 用结构体变量的成员作参数 例如 用stu 1 num或stu 2 name作函数实参 将实参值传给形参 值传递 方式 2 用结构体变量作实参 采用 值传递 方式 将结构体变量所占的内存单元的内容全部顺序传递给形参 例 有一个结构体变量stu1 内含学生学号 姓名 数学和英语两门课的成绩 要求在main函数中赋值 在函数print中将它们打印输出 include includestructstudent longintnum charname 20 floatmath floateng voidmain voidprint structstudent structstudentstu1 stu1 num 80601 strcpy stu1 name Liling stu1 math 80 5 stu1 eng 90 print stu1 voidprint structstudentstu printf ld n s n 1f n 1f n stu num stu name stu math stu eng 3 结构变量 或数组 的地址作为实参传递给形参例 将上例改用指向结构体变量的指针作实参 include include defineFORMAT ld n s n 1f n 1f n structstudent longintnum charname 20 floatmath floateng voidmain structstudentstu1 80601 Liling 80 5 90 sp 实质都一样即实参为stu1的起始地址 voidprint structstudent p 形参类型修改了 printf FORMAT p num p name p math p eng 用指针变量调用各成员之值 printf n stu1 numnamematheng sp p 结构体指针作函数参数 8 4结构数组应用举例 例 候选人得票的统计 设有3个候选人 要选择其中的一人当班长 从键盘上输入得票的候选人的名字 输出最终的得票结果 include stdio h include string h structperson charname 10 intcount leader 3 Chen 0 Yang 0 Zhou 0 voidmain inti j charname 20 存放被选中候选人的姓名 for i 1 i 10 i scanf s name for j 0 j 3 j if strcmp name leader j name 0 leader j count printf n for i 0 i 3 i printf 6s 2d n leader i name leader i count 8 5共用体 共用体是一种类似于结构体的构造型数据类型 它允许不同类型和不同长度的数据共享同一块存储空间 8 5 1共用体类型定义及初始化 一 共用体的声明一般形式 union共用体名 类型名1成员名1 类型名2成员名2 类型名n成员名n 共用体的声明只规定了一种组织形式 不分配存储空间 二 共用体变量的定义1 类型声明与变量定义分开 例如 unionmydata inti charch floatf unionmydatadata1 data2 2 类型声明与变量定义合在一起 例如 unionmydata inti charch floatf data1 data2 3 类型声明与变量定义合在一起 但缺省共用体名 例如 union inti charch floatf data1 data2 三 共用体变量的引用 一般形式 共用体变量名 成员名或 共用体指针名 成员名或共用体指针名 成员名 include stdio h unionmydata inti charch floatf data1 p 8 5 2使用共用体变量应注意的问题 1 参与运算或操作的是共用体变量的某个成员 不能是共用体变量整体例如 printf d data1 是错误的 应写成 printf d data1 i 或 printf c data1 ch 等 2 同一个内存段可以用来存放几种不同类型的成员 但在每一瞬时只能存放其中一种 而不是同时存放几种 例如 data1 i 20 data1 ch M data1 f 80 5 在完成以上3个赋值运算以后 只有data1 f是有效的 3 共用体变量的地址和它的各成员的地址都是同一地址 4 不能在定义共用体变量时对它初始化 也不能对共用体变量名赋值 例如 下面这些都是不对的 union inti charch floatf a 2 m 6 5 不能初始化 a 2 不能对共用体变量赋值 5 不能把共用体变量作为函数参数 也不能使函数带回共用体变量 但可以使用指向共用体变量的指针 与结构体变量这种用法相仿 8 6枚举 8 6 1枚举类型的概念及其定义枚举类型的概念列举出所有可能的取值的一种数据结构 枚举类型的定义enum枚举名 枚举元素1 枚举元素2 枚举元素n 如 enumweekday sun mon tue wed thu fri sat enumweekdayweekend workday 或 enumweekday sun mon tue wed thu fri sat workday 或 enum sun mon tue wed thu fri sat workday 枚举类型变量的赋值和使用 1 枚举值是常量 不是变量 sun 5 mon 2 sun mon 均是错误的 2 枚举类型是有序数据类型 如 weekday中 sun为0 mon为1 sat为6 再如 main enumweekday sun mon tue wed thu fri sat a b c a sun b mon c tue printf d d d a b c 运行结果为 0 1 2 3 可改变枚举元素的值 enumweekday sun 7 mon 1 tue wed thu fri sat workday 则tue 2 wed 3 Sat 6 4 枚举元素可比较 如默认时 mon sun 5 只能将枚举值赋予枚举变量 不能把元素的数值赋予枚举变量如 a sun b mon 是正确的 而a 0 b 1 是错误的 但a enumweekday 2或b enumweekday 5 3 是正确的 6 枚举元素不是字符串常量 使用时不要加单引号或双引号 7 由于C编译程序将枚举量作为整型数来处理 所以在程序中任何可使用常数的地方 都可以使用枚举常量符号名 如 enumcolor red green yellow col switch col casered printf red n break casegreen printf green n break caseyellow printf yellow n break default printf undefined n break 8 同一作用域内 枚举常量与变量必须互不相同 8 7用typedef为类型定义别名 typedef可完成为类型取别名typedef的一般形式typedef类型名新类型名 如 typedeffloatreal reala f 再如 typedefchar pointer pointerp string Thisisaexample 甚至还可用typedef为更为复杂的结构类型 联合类型 枚举类型规定一个别名等 如 typedefstructtnode char word intcount structtnode left structtnode right treenode treenodep 相当于 structtnodep
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!