7复合结构ppt课件_第1页
7复合结构ppt课件_第2页
7复合结构ppt课件_第3页
7复合结构ppt课件_第4页
7复合结构ppt课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

第7章复合结构类型 C语言的数据类型 教学目标 结构体类型的概述结构体类型的定义结构体变量的定义及内存分配结构体变量的初始化和引用结构体数组结构体变量和结构体数组成员的访问指向结构体类型数据的指针结构体型与函数用递归结构处理链表共用体型枚举类型用typedef定义类型 7 1结构体类型的概述 所谓 结构体类型 是由不同数据类型变量组成的集合体 相当于其他高级语言中的记录 结构体类型的数据由若干称为 成员 的数据组成 每个成员既可以是一个基本数据类型的数据 也可以是另一个构造类型的数据 例如 定义一个婴儿的出生证明的结构体 structbaby charname 20 婴儿姓名 charsex 性别 chardate 20 出生日期 charnum 30 floatweight 出生时的体重 charplace 30 出生地 1 结构体类型的定义说明 结构体类型定义的一般格式为 Struct结构体名 数据类型1成员名1 数据类型2成员名2 数据类型3成员名3 数据类型n成员名n 7 2结构体类型的定义 其中 struct是关键字 struct连同其后的结构体标识符一起称为结构体类型名或结构体名 结构体名是用户定义的标识符 其命名原则应符合标识符的书写规定 数据类型可以是基本类型说明符 也可以是已定义过的结构体类型名 还可以是后面将要介绍的共用体型等 成员名也是用户自定义的标识符 用来标识所包含的成员名称 各成员的定义语句放在花括号中 花括号后面的分号是整个定义语句的结尾 1 结构体类型的定义说明 7 2结构体类型的定义 例7 1 将学籍管理记录定义成一个名为structstudent的结构体类型 structstudent charnumber 5 name 学号和姓名 charsex 性别 intage 年龄 floatscore 总分 char speciality 专业 charschool 31 学校 1 结构体类型的定义说明 2 定义结构体类型时需要注意的问题 1 类型与变量是不同的概念 不要混淆 2 每个成员都必须有自己的数据类型 3 结构体中的成员可以单独使用 4 结构体成员可以和程序中的其他标识符同名 也可以和另一个结构体的成员同名 5 结构体类型定义的位置 可以在函数内部 也可以在函数外部 6 结构体中的成员名可以与程序中的变量名相同 但两者并不代表同一对象 7 注意结构体和数组之间的区别 数组里放的都是类型相同的数据 而结构体中可以放不同类型的数据 3 结构体型的嵌套定义 结构体型的定义可以嵌套 即某个结构体型成员的数据类型可以说明为另一个已定义过的结构体类型 例如将上面定义的结构体类型中的成员 age 改为出生日期 birthday 由于出生日期包含年 月 日三个整型数据 可以将它定义成另外一个名为structdate的结构体类型的变量 并将该变量作为结构体类型structstudent的一个成员 即 7 2结构体类型的定义 structdate intyear intmonth intday structstudent charnum 5 name charsex structdatebirthday floatscore char speciality charschool 31 也可以写成嵌套定义的形式 7 3 1结构体变量的定义 三种方法 先定义结构体 后定义变量在定义结构体类型的同时定义变量直接说明结构体变量 7 3结构体变量的定义及内存分配 1 先定义结构体 后定义变量 例如 为学生信息定义两个变量m和n 程序如下 structstudent intnum charname 20 intage charsex charplace 20 structstudentm n 定义结构体变量m和n 7 3 1结构体变量的定义 也可以在定义变量的同时 对变量赋初值 例如 上面的例子中定义的语句可以改写成如下赋初值的形式 structstudentm 20041 wangtai 18 m 江西 n 20043 zhaoli 16 f 福建 这种方法是将类型定义和变量定义分别进行的 是一种比较常用的定义方法 7 3 1结构体变量的定义 1 先定义结构体 后定义变量 这种方法是在说明结构体变量的同时定义结构体变量 这种形式定义的一般格式为 struct结构体名 成员列表 变量名列表 2 在定义结构体类型的同时定义变量 7 3 1结构体变量的定义 直接说明结构体类型变量的一般格式为 struct 成员列表 变量名表列 这种方法与第二种方法的区别在于第三种方法中省去了结构体名 而在后面直接给出结构体变量 3 直接说明结构变量 7 3 1结构体变量的定义 例如 struct intnum charname 20 intage charsex charplace 20 m 20041 wangtai 18 m 江西 n 20043 zhaoli 16 f 福建 7 3 1结构体变量的定义 3 直接说明结构变量 结构体类型的内存分配模式随该类型中包含的成员不同而不同 需要的内存字节数等于各个成员所需要的内存字节数的总和 一旦定义了结构体类型的变量或数组后 就要按这种结构体类型的内存分配模式占用内存 7 3 2结构体类型的内存分配模式 7 3结构体变量的定义及内存分配 7 4 1结构体变量的初始化7 4 2结构体变量的引用 7 4结构体变量的初始化和引用 7 4 1 结构体变量的初始化 结构体变量的初始化形式与前面介绍的数组相似 只要把对应各成员的初值放在花括号中即可 例7 2 includestructstudent intnumber charname 20 charsex structdate intyear intmonth intday birthday floatscore charspeciality 11 charschool 31 main structstudentst1 1001 Liming 0 1983 10 25 573 Computer 3thHighSchool Beijing 结构体变量st1的定义和初始化 printf 4d 10s c 4d 2d 2d 2f 10s s n st1 number st1 name st1 sex st1 birthday year st1 birthday month st1 birthday day st1 score st1 speciality st1 school 输出结构体变量st1的各数据项 7 4 1 结构体变量的初始化 结构体变量初始化后 C编译系统按结构体成员的顺序将各个初值置于各成员对应的存储单元 注意 对结构体变量初始化时 不允许跳过前面的成员只给后面的成员赋初值 但可以只给前面的成员赋初值 后面未赋初值的成员自动赋零值 字符型数组赋空串 程序运行结果为 1001Liming019831025573 00Computer3thHighschool Beijing 7 4 1 结构体变量的初始化 7 4 2结构体变量的引用 不能直接使用结构体变量 只能通过引用其中的成员来实现对结构体变量的使用 引用结构体变量成员的一般形式为 结构体变量名 成员名例如 m num 表示m变量中的num成员 如果成员本身又是一个结构体 则必须逐级找到最低级的成员才能使用 例如 m birthday month 表示m变量中的birthday成员中的month成员 m变量出生的月份成员可以在程序中单独使用 与普通变量的使用完全相同 例7 3 结构体变量成员的引用 include string h structstudent 定义student类型 intnum charname 20 charsex floatscore main structstudentm m num 20048 给结构体变量m的成员num赋值 strcpy m name zhangsan 用strcpy给结构体变量x的成员name赋值 7 4 2结构体变量的引用 m sex f 给结构体变量x的成员sex赋值 m score 95 给结构体变量x的成员score赋值 printf num dname ssex cscore f m num m name m sex m score 输出结构体变量m的各数据项的值 该程序的运行结果如下 num 20048name zhangsansex fscore 95 000000 7 5结构体数组 7 5 1结构体数组的定义间接定义直接定义7 5 2结构体数组的初始化访问结构体变量的成员访问结构体数组元素的成员访问嵌套的结构体成员 1 间接定义 先定义结构体类型 再用结构体类型名定义该类型的数组 这是一种间接定义的方式 例如 structstudent intnum charname 20 charsex floatscore structstudentstu 3 2 直接定义 在定义结构体类型的同时定义该类型的数组 这是一种直接定义的方式 例如 structstudent charnumber 5 name charsex structdate intyear intmonth intday birthday floatscore char speciality charschool 31 st1 st2 10 p1 在直接定义时 也可以在struct后面不带结构体标识符 这种结构体类型称为无名结构体类型 例如 struct charnumber 5 name charsex structdate intyear intmonth intday birthday floatscore char speciality charschool 31 st1 st2 10 p1 2 直接定义 说明 有名结构体类型和无名结构体类型比较 1 有名结构体类型的类型名可以使用多次 可以用它去定义其他的同类型变量 数组或指针 2 无名结构体类型只能使用一次 不能用无名结构体类型再去定义其他的变量 数组或指针 2 直接定义 7 5 2结构体数组的初始化 结构体数组的初始化相当于给若干个结构体变量初始化 只要将各个元素的初值顺序放在内嵌的花括号中即可 当整个数组的各个元素都有初始化数据时 内嵌花括号也可省略 例7 5 以三个学生为例计算学生的平均成绩和及格人数 includestructstudent intnum charname 20 charsex floatscore stu 3 11 Liangtao t 80 13 Zhaojun f 97 5 14 Haikang f 58 stu 0 stu 1 stu 2 main inti j 0 floataverage sum 0 for i 0 i 60 j 1 统计及格人数 printf thesumis f n sum average sum 3 求平均成绩 printf theaverageis f ncount d n average j 7 6结构体变量和结构体数组成员的访问 访问或引用结构体变量或结构体数组的某个成员 必须指明该成员属于哪一个结构体变量或结构体数组元素 7 6 1访问结构体成员运算符7 6 2访问结构体成员的方法 7 6 1访问结构体成员运算符 1 运算符2 运算符 运算符称点运算符 当用结构体变量名或结构体数组元素访问其成员时 要用 运算符 例如 m age 表示访问m的成员age的值 1 运算符 7 6 1访问结构体成员运算符 运算符由一个减号和一个大于号组成 当用结构体指针或结构体数组名等地址量访问其成员时 要用 运算符 说明 运算符和 运算符都是二元 单目 运算符 它们和 一起处于最高优先级 结合性均为从左至右 2 运算符 7 6 1访问结构体成员运算符 7 6 2访问结构体成员的方法 1 访问结构体变量的成员2 访问结构体数组元素的成员3 访问嵌套的结构体成员 若已定义了一个结构体变量及指向它的指针 可以使用以下三种方法访问该结构体变量的成员 结构体变量名 成员名结构体指针名 成员名 结构体指针名 成员名访问该成员的地址 结构体变量名 成员名 结构体指针名 成员名 7 6 2访问结构体成员的方法 1 访问结构体变量的成员 若已定义了一个结构体数组及指向它的指针 则可以用数组名 相当于指针 数组元素名 相当于变量 或指向该数组的指针 并通过相应的运算符 或 来访问该数组元素的各个成员 主要有以下几种形式 结构体数组元素 成员名结构体数组名 成员名结构体指针名 成员名 结构体指针名 成员名 2 访问结构体数组元素的成员 7 6 2访问结构体成员的方法 若结构体成员是内嵌的结构体时 必须用若干个 或 顺序地逐层定位到最里层的成员 假设有一个结构体变量及指向它的结构体指针 该结构体变量的成员含有另一个结构体变量 则访问内嵌成员的形式有以下几种 结构体变量名 内嵌结构体变量名 成员名结构体指针名 内嵌结构体变量名 成员名 结构体指针名 内嵌结构体变量名 成员名 3 访问嵌套的结构体成员 7 6 2访问结构体成员的方法 下面以结构体类型structstudent为例 说明访问结构体成员的各种等价表示形式 若structstudent 定义结构体 charnumber 5 name charsex structdate intyear intmonth intday birthday floatscore char speciality charschool 31 structstudentst1 st2 10 p1 则访问结构体成员 包括变量 数组 指针和内嵌结构 的各种等价形式列于表7 3 表7 3结构体成员访问形式示例 7 7指向结构体类型数据的指针 结构体类型的指针与基本类型的指针相比 除了所指向的对象不同外 在存储形式和使用形式上并没有差别 7 7 1结构体指针的初始化7 7 2结构体指针的应用 可以通过用结构体变量的首地址或结构体数组的数组名作结构体类型指针的初值 从而使其指向对应的结构体变量或结构体数组 7 7 1结构体指针的初始化 7 7指向结构体类型数据的指针 7 7 2结构体指针的应用 7 7指向结构体类型数据的指针 1 指向结构体变量的指针 一个结构体变量的指针就是该变量所占有的内存的起始地址 可以设一个指针变量 用来指向一个结构体变量 此时该指针变量的值是结构体变量的起始地址 例7 6 指向结构体变量指针的应用 includemain structstudent 定义结构体 intnum charname 20 charsex floatscore structstudentstuone 定义结构体变量 structstudent p 定义结构体指针 p 用指针的方式输出stuone中各个成员的数据值 2 指向结构体数组的指针 对结构体数组及其元素也可以使用指针来指向 例7 7 指向结构体数组指针的应用 includemain structbaby intbornnum charname 20 charsex charplace 20 7 7 2结构体指针的应用 structbabybab 2 201 Lile M Jiangshu 112 Zhaoliang F Sandong 定义结构体数组并初始化 structbaby p 定义结构体指针 for p bab pbornnum p name p sex p place 程序的运行结果为 bornnum 201name Lilesex Mplace Jiangshubornnum 112name Zhaoliangsex Fplace Sandong 7 8结构体型与函数 7 8 1结构体型的数据作函数的参数 有三种情况 1 结构体变量的成员作参数2 结构体变量作参数3 指向结构体变量 或数组 的指针作参数 1 结构体变量的成员作参数 调用函数将单个结构体成员传递给被调用函数的用法与普通变量做参数一样主要有以下三种形式 1 如果该结构体成员是简单变量 则被调用函数对应的形参应该是同类型的简单变量 2 如果该结构体成员是变量的地址 则被调用函数中对应的形参应该是指针变量 3 如果该结构体成员是数组或指向数组的指针 则被调用函数对应的形参应该是数组名或指针 7 8 1结构体型的数据作函数的参数 例7 8 假设学生的三门课成绩已保存在一个结构数组中 要求用子程序计算并返回三门课的总分 在主程序main 中先定义一个结构体类型 再创建一个结构体数组 并将该数组的成员score 数组 传递到子程序add 中 由add 计算总分并返回 includemain structstu 定义结构体 charname 80 intscore 3 inttotal structstustudent 3 定义结构体数组 inti printf Pleaseenterthreestu nameandthreescoreforthethreestu n for i 0 i 3 i 将学生的课程成绩输入结构体数组中 scanf s student i name scanf d d d 程序的运行情况为 Pleaseenterthreestu nameandthreescoreforthethreestu Zhangli 98 90 97 Wanghong 89 88 98 Liufei 78 89 97 Thescore tableofthethreestudentsis zhangli989097285wanghong898898275liufei788997264在上述程序中要传递的成员是一个数组 因此需要将该数组的各个元素作为单个变量来传递 2 结构体变量作参数 调用函数将结构体变量整体传递给被调用函数时 采用的是 值传递 的方式 此时将结构体变量所占内存单元的内容全部顺序传递给形参 形参必须是同类型的结构体变量 具体可以采用以下三种形式 1 实参和形参都是结构体变量名 2 实参是结构体变量的地址 形参是相同结构体类型的指针 3 实参和形参都是相同结构体类型的指针 7 8 1结构体型的数据作函数的参数 例7 9 用结构体变量的地址作为实参调用函数的应用举例 includestructscore 定义课程分数的结构体 intmath intchinese intenglish structinformation 定义学生信息的结构体 intnum charname 20 structscoresco intaverage score voidgetinfo structinformation p getinfo函数的说明 voidcomp structinformation p comp函数的说明 main structinformationexam 定义结构体变量exam getinfo 输入学生的名字 printf Thethreescore math chinese english of sis n p name scanf d d d if p average score 85 根据平均成绩判断该学生是否优秀 printf Excellent n elseprintf General n 程序的运行情况为 Pleaseentertheinformationofonestudent No 12 Name Jim Thethreescore math chinese english ofJimis 98 90 97 TheinformationaboutJimis No 12Name Jimmath 98 hinese 90 English 97 average score 95Excellent 3 指向结构体变量 或数组 的指针作参数 用指向结构体变量 或数组 的指针作为实参 将结构体变量 数组 的地址传给形参 可以提高程序的运行效率 例7 10 有一个结构体变量stu 内含学生学号 姓名和3门课的成绩 要求在main函数中赋以值 在另一函数pirnt中将它们打印输出 includestructstudent intnum charname 20 intscore 3 voidprint structstudent p 定义print函数 printf d n s n d n d n d n p num p name p score 0 p score 1 p score 2 输出指针p所指学生的输出成绩 printf n main structstudentstu 10020 Mary 89 98 79 print 调用函数print 程序的输出结果为 10020Mary899879 7 8 2结构体型的函数 1 结构体型函数2 结构体指针型函数 1 结构体型函数 结构体型函数定义的一般形式为 struct结构体名函数名 形参表 函数体 例如 structstudentfunction intx inty 函数头 函数体 上述程序定义了一个structstudent结构体类型的函数 它可以将一个结构体变量返回到调用函数 例7 11 一个通讯录中包括联系人的编号 姓名 电话 电子邮件 居住地 根据编号查找并输出查找到的联系人的信息 includestructperson 定义结构体数组 并将联系人的相关信息存入该数组 intnum charname 20 chartelephone 12 charemail 40 charaddr 30 con person 3 9 Zhanglizhangli Shanghai 6 Jack 01089789091 jack09 Bejing 12 Qiuzhiqiuzhi Hangzhou structpersonfind intn 定义查找函数find inti for i 0 con person i num 0 i if con person i num n return con person i main intnumber structpersonresult 定义结构体变量 printf Enterthenumber scanf d 程序的运行情况为 Enterthenumber 12 Name QiuzhiTelephonemail qiuzhi Address HangzhouEnterthenumber 9 Name ZhangliTelephonemail zhangli Address ShanghaiEnterthenumber 1 Notfound 2 结构体指针型函数 含义 返回结构体指针的函数结构体指针型函数定义的一般形式为 struct结构名 函数名 形参表 函数体 例如 structstudent function intx inty 函数头 函数体 例7 12 将例7 11程序中的结构体型函数改成结构体型指针型函数 includestructperson 定义结构体数组并进行初始化赋值 intnum charname 20 chartelephone 12 charemail 40 charaddr 30 con person 3 9 Zhanglizhangli Shanghai 6 Jack 01089789091 jack09 Bejing 12 Qiuzhiqiuzhi Hangzhou structperson find intn 定义函数find inti for i 0 con person i num 0 i if con person i num n return 程序的运行情况为 Enterthenumber 6 Name JackTelephone 01089789091Email jack09 Address BeijingEnterthenumber 9 Name ZhangliTelephonemail zhangli Address ShanghaiEnterthenumber 10 Notfound 7 10共用体型 共用体由若干个数据类型组合而成 和结构体型不同的是 共用体数据中所有成员都占用相同的内存单元 设置这种数据类型的主要目的就是节省内存空间 例7 17 在一个函数的三个不同的程序段中分别使用了字符型变量c1 整型变量d1 单精度型变量f1 这时就可以把它们定义成一个共用体变量un un中含有三个不同类型的成员 为了节省空间 假如现在只给三个成员一共分配4个内存单元 那么3个成员之间的对应关系如下图 7 10共用体型 7 10 1共用体的定义 共用体定义的一般形式为 union共用体名 数据类型1成员名1 数据类型2成员名2 数据类型n成员名n 共用体名是用户自定义的标识符 数据类型通常是前面所使用的基本数据类型 也可以是结构体型 共用体型等构造类型 例如 以下代码说明了一个共用体un1 unionun1 inta 100 charm 100 floatn 200 其中 成员a占用了200个单元的内存空间 因为a为整型 而一个整型占2个单元的空间 所以2 100 200 同理 成员m占用了1 100 100个内存单元 成员n占用了4 200 800个内存单元 所以 该共用体共占用了800个单元空间 7 10 2共用体变量的定义 定义好一个共用体后 就可以使用它来定义相应的共用体类型的变量 数组等 共用体变量定义的方法也有三种 1 先说明共用体 再定义共用体变量 2 在说明共用体类型的同时定义共用体变量 3 直接定义共用体变量 例如 将含有10个元素的整型数组m 10 字符型数组n 3 5 双精度数据a定义成一个共用体un 然后再定义这个共用体的变量x和y 下面分别用上述的三种方法进行定义 3 定义无名称的共用体 同时定义变量x和y union intm 10 charn 3 5 doublea x y 1 先定义共用型 然后再定义变量x和y unionun intm 10 该成员共占用了20个单元空间 charn 3 5 该成员共占用了15个单元空间 doublea 该成员共占用了8个单元空间 该共用体共占用了20个单元空间 unionunx y 定义两个共用体变量x和y 2 同时定义共用体un和变量x y unionun intm 10 charn 3 5 doublea x y 7 10 3共用体变量的引用 对共用体变量不可以直接存取内容 1 直接引用2 通过指向共用体变量的指针进行引用3 共用体变量与函数 1 直接引用 共用体变量成员的直接引用是通过运算符 实现的 其引用的一般格式为 共用体变量名 成员名例如 union intm charch doublea x printf d c lf x m x ch x a 上述printf语句中的x m x ch x a是对共用体变量x成员m ch a的引用 2 通过指向共用体变量的指针进行引用 通过指向共用体变量的指针可以对共用体变量的成员进行存取操作 其一般的语法格式为 指向结构体变量的指针 成员名或 指向结构体变量的指针 成员名 例7 18 通过共用体变量的指针对共用体变量中的成员进行引用的应用举例 includeunionstu 定义共用体 char name intnum main unionstu p stuone 定义共用体指针和共用体变量 p 用指针输出num的值 说明 指向共用体变量的指针对共用体变量的操作可以通过强制转换后的指针存取共用体变量的成员 而不必指定成员名 系统会根据强制转换的数据类型给与该类型相同的数据成员赋值 2 通过指向共用体变量的指针进行引用 例7 19 通过强制转换后的指针引用共用体变量成员的举例 includeunionworker 定义共用体 floatsalary intnumber main unionworker p personone 定义共用体指针和共用体变量 p 3 共用体变量与函数 共用体变量本身不能作为函数的参数 但共用体成员可以在函数中进行引用 而且函数也不能返回共用体变量 但是指向共用体变量的指针可以作为函数的参数 返回值也可以是指向共用体变量的指针 例7 20 共用体变量的成员和共用体指针作函数参数的应用举例 includeuniontraffic char name intnum voidroad char x 定义road函数 printf Thenameoftrafficis s n x voidair uniontraffic x 定义air函数 printf Thenameoftrafficis s n x name main uniontraffic p traone 定义共用体指针和共用体变量 p 调用air函数 程序的运行结果为 Thenameoftrafficiscar Thenameoftrafficiscar 7 10 4共用体类型数据的特点 1 共用体中的多个成员共用一个内存段 但同一瞬间只有一个成员占用内存段 即每一瞬时只有一个成员存在和起作用 不能所有的成员同时在内存段中起作用 2 共用体变量的地址和共用体各个成员的地址都是同一个地址 例如 unoinsr charch1 floata unionsrstr 定义共用体变量str 此时 str str ch1 str a的地址值是同一个 3 共用体中起作用的成员是最后一次存放的成员 例如 unoincc inta intb intc unoinccch1 定义共用体变量ch1 ch1 a 2 为ch1的成员a赋值 ch1 b 3 为ch1的成员b赋值 ch1 c 4 为ch1的成员c赋值 此时若执行以下语句 printf d ch1 a printf d ch1 b printf d ch1 c 则三条语句的输出结果均为4 7 10 4共用体类型数据的特点 4 共用体类型可以在结构体类型中定义 结构体类型也可以在共用体类型中定义 例如 以下共用体cc的成员中就有结构体类型的变量bb unoincc 定义共用体 inta charb 20 structdd inti intj bb 定义结构体变量bb 5 共用体类型可以嵌套定义 例如 unoinaa inta charb 20 unoinbb inti intj c 定义共用体变量c 7 10 4共用体类型数据的特点 6 不能对共用体变量名赋值 也不能通过引用变量名得到一个值 7 共用体类型的变量不能作为函数的参数 也不能使函数返回共用体变量 但可以使用共用体变量的指针 8 不能在定义共用体变量时对其进行初始化 unoincc inta intb intc s 2 3 4 7 10 4共用体类型数据的特点 7 10 5结构体和共用体的区别 结构体和共用体之间存在着以下的区别 1 结构体和共用体都是由多个不同的数据类型成员组成 但在同一时刻 共用体中只存放一个被选中的成员 而结构体的所有成员都存在 2 对共用体的不同成员赋值 将会造成对其他成员的重写 原来成员的值就不存在了 而对于结构体的不同成员赋值是互不影响的 例7 21 共用体和结构体应用举例 includemain union 定义一个共用体 inti struct 在共用体中定义一个结构体 charfirst charsecond sql 1 定义一个结构体变量sql 1 number 定义一个共用体变量number number i 0 x4445 给共用体变量的成员赋值 printf c c x n number sql 1 first umber sql 1 second number i number sql 1 first c 给共用体变量中的结构体成员赋值 number sql 1 second d printf x n number i 程序的输出结果为 ED44456463 7 11枚举类型 枚举是C语言为用户提供的一种自定义的数据类型 它将变量的值一一列举出来 且变量的取值只局限在列举的值的范围内 主要用途 用名称来代替某些有特定含义的数据 从而增加程序的可读性 7 11 1枚举型的定义 枚举型定义的一般形式为 enum枚举名 枚举常量1 枚举常量2 枚举常量n 其中的枚举常量是用户给常量取的标识符 有固定的值 在一个含有n个枚举常量的枚举型中 C语言规定枚举常量的值按枚举的顺序分别依次等于0 1 n 1 例如 定义一个表示星期的枚举型 enumweek sun mon tue wed thu fri sat 上述语句定义了一个名为 week 的枚举类型 该枚举型中有7个枚举常量 分别是 sun mon tue wed thu fri和sat 即一周中的七天 每个枚举常量按规定其值从0开始依次为0 1 2 3 4 5 6 7 11 2枚举变量的定义 枚举变量的定义和结构体相似 有以下三种方式 1 先定义枚举型 再定义枚举变量 enum枚举名变量名表 例如 enumtraffic train plane car ship enumtraffictrone trtwo 上述语句定义了两个枚举变量 trone和trtwo 2 在说明枚举型的同时定义枚举型的变量 例如 enumtraffic train plane car ship trone trtwo 3 不说明枚举型 无名 直接定义枚举变量 例如 enum train plane car ship trone trtwo 7 11 3给枚举常量赋初值 方法 在枚举常量的后面跟上 整型常量 例如 下面是一个表示三原色的枚举型 enumcolor red 3 yellow 5 blue 8 此时 枚举常量red的值为3 yellow的值为5 blue的值为8 在给枚举常量赋初值时 若给其中任何一个枚举常量赋初值 则后面的枚举常量将按自然数的规则依次赋初值 例如 enumweekday sun mon tue wed 6 thu fri sat 上面的例子只给枚举常量wed赋了初值 在这种情况下 每个枚举常量的初值分别如下 sun的值为0 mon的值为1 tue的值为2 wed的值为6 thu的值为7 fri值为8 sat值为9 7 11 4枚举中的几条规定 1 枚举变量的取值只能在枚举常量的范围内 不能取其他任何数 例如 如果变量x y z被说明为枚举型week的变量enumweek sun mon tue wed thu fri sat enumweekx y z 则x sun y tue z fri 都是正确的 2 枚举值是常量 不是变量 不能企图在程序中用赋值语句再对枚举值进行赋值 也就是不能将其当作变量使用 即不能在赋值号的左边使用枚举常量 例如 对枚举week的元素继续作以下赋值 mon 7 thu 3 sat tue 都是错误的 3 枚举元素本身由系统定义了一个表示序号的数值 从0开始顺序定义为0 1 2 例7 22 枚举型week中枚举常量的数值 includemain enumweek sun mon tue wed thu fri sat x y z 定义枚举变量x y z x sun 为x赋值 y mon 为y赋值 z thu 为z赋值 printf sunis d nmonis d nthuis d n x y z 程序的运行结果如下 sunis 0monis 1thuis 4 4 可以把枚举常量值赋予枚举变量 但是 却不能把元素的数值直接赋予枚举变量 例如 x sun y mon 表示是正确的 而x 0 y 4 表示是错误的 5 如果一定要把数值赋予枚举变量 则必须用强制类型转换 即用强制类型转换可以将数值赋予枚举变量 例如 enumweek sun mon tue wed thu fri sat enumweekx x enumweek 5 上述赋值

温馨提示

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

评论

0/150

提交评论