第16章 结构联合和枚举new_第1页
第16章 结构联合和枚举new_第2页
第16章 结构联合和枚举new_第3页
第16章 结构联合和枚举new_第4页
第16章 结构联合和枚举new_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、结构结构, 联合和枚举联合和枚举12NameEmailStuNumTelQQ同学i同一同学信息在内存中没有关联同一同学信息在内存中没有关联希望进行关联希望进行关联将同一同学信息存放到一起将同一同学信息存放到一起3NameEmailStuNumTelQQ同学i不尽相同类型数据的集合:结构常用于存储相关数据项集合同学i+1结构结构VS数组:数组: 结构成员(元素)不必类型相同结构成员(元素)不必类型相同 结构成员有名字,不必通过位置(下标)访问结构成员有名字,不必通过位置(下标)访问常用于存储相关数据项集合常用于存储相关数据项集合仓库零部件结构:仓库零部件结构:struct int number;

2、 char nameNAME_LEN+1; int on_hand; part1, part2;struct 类型,类型, part1,part2变量变量4学生信息结构学生信息结构struct char Name;char email;_int64 StudentNumber;_int64 MobilePhoneNumber_int64 QQNumber; stu1, stu2;5结构成员按声明顺序存储结构成员按声明顺序存储part1存储(始存储(始地址地址2000) number占占4字节字节 NAME_LEN值值25 成员之间没有空隙成员之间没有空隙6声明初始化声明初始化:struct i

3、nt number; char nameNAME_LEN+1; int on_hand; part1 = 528, Disk drive, 10, part2 = 914, Printer cable, 5;初始化后初始化后part1:7访问结构成员:访问结构成员: 结构名结构名.成员名成员名/句点句点.运算符运算符显示显示part1成员值成员值printf(Part number: %dn, part1.number);printf(Part name: %sn, );printf(Quantity on hand: %dn, part1.on_hand);结构成员赋值及

4、自增结构成员赋值及自增:part1.number = 258; part1.on_hand+;8结构成员可作变量使用结构成员可作变量使用结构赋值结构赋值: part2 = part1;等价于:等价于: part2.number=part1.number; =; part2.on_hand=part1.on_hand;与数组之重大区别与数组之重大区别9前提:前提: 只能用于兼容类型的结构只能用于兼容类型的结构 如如 part1 和和part2兼容兼容除了赋值,除了赋值,C不提供对整个结构的操作不提供对整个结构的操作 =和和!=不能用于结构不能用于结构.10

5、假设程序需要声明几个具有相同成员的假设程序需要声明几个具有相同成员的结构变量结构变量.先声明结构类型(命名),再声明结构先声明结构类型(命名),再声明结构变量变量命名结构的方法命名结构的方法: 声明结构标记声明结构标记 typedef定义结构类型定义结构类型11声明名为声明名为part的结构标记的结构标记:struct part int number; char nameNAME_LEN+1; int on_hand;/分号不可少分号不可少part标记能用于声明结构变量标记能用于声明结构变量:struct part part1, part2;/struct part类型名类型名12typede

6、f定义结构类型定义结构类型定义名为定义名为Part的结构类型的结构类型:typedef struct int number; char nameNAME_LEN+1; int on_hand; Part;定义定义Part类型变量类型变量:Part part1, part2;13以结构变量作为参数的函数以结构变量作为参数的函数:void print_part(struct part p) printf(Part number: %dn, p.number); printf(Part name: %sn, ); printf(Quantity on hand: %dn, p.on_ha

7、nd);调用函数调用函数:print_part(part1);14返回返回part结构的函数结构的函数:struct part build_part(int number, const char *name, int on_hand) struct part p; p.number = number; strcpy(, name); p.on_hand = on_hand; return p;函数调用函数调用:part1 = build_part(528, Disk drive, 10);15结构和数组可以无约束地结合结构和数组可以无约束地结合. 数组以结构为元素数组以结构为元素

8、结构以数组和结构为成员结构以数组和结构为成员.16struct person_name char firstFIRST_NAME_LEN+1; char middle_initial; char lastLAST_NAME_LEN+1;person_name嵌入嵌入student:struct student struct person_name name; int id, age; char sex; student1, student2;访问访问student1的名的名, 中间名首字母或姓需要使用中间名首字母或姓需要使用.操作操作符两次符两次:strcpy(.fi

9、rst, Fred);17以结构为元素构造数组:数组和结构结以结构为元素构造数组:数组和结构结合最普遍形式之一。合最普遍形式之一。这种数组可以作为简单的数据库这种数组可以作为简单的数据库.存储存储100个个part的结构数组的结构数组:struct part inventory100;struct student listMAX_STU_NUM;18下标访问数组元素(结构)下标访问数组元素(结构):print_part(inventoryi);访问访问part结构成员需联合使用下标和结构成员需联合使用下标和成员选择成员选择:inventoryi.number = 883;访问访问part名里的

10、单个字符需要使用下名里的单个字符需要使用下标、再选择、再下标标、再选择、再下标:0 = 0;19像结构:像结构: 由一个或多个可能不同类型的成员组成由一个或多个可能不同类型的成员组成编译器只为最大的成员分配足够的空间编译器只为最大的成员分配足够的空间, 各个成员共享空间(相互覆盖)各个成员共享空间(相互覆盖)为一个成员赋一个新值也会改变其他成为一个成员赋一个新值也会改变其他成员的值员的值.20联合变量的一个例子联合变量的一个例子:union int i; double d; u;联合的声明很像结构的声明联合的声明很像结构的声明:struct int i; doub

11、le d; s;21联合中成员在一个时刻只有一个有效结构结构s和联合和联合u的区别:的区别:s的成员在内存中存的成员在内存中存储在不同的地方储在不同的地方.u 的成员存储在同一的成员存储在同一个地方个地方.22eg,儿童购票问题儿童购票问题定义:定义:union int age; double height; u; 年龄:年龄:if(u.age=12) 身高:身高:if(u.height=120.00)使用联合使用联合: 节省空间节省空间 建立混合数据结构建立混合数据结构 以不同的方式看待存储器以不同的方式看待存储器 (在第在第20章里讨论章里讨论)23设计礼品目录设计礼品目录每件商品有一个存

12、货号和价格每件商品有一个存货号和价格, stock_number、 price以及其他一些依赖于商品类型的信息以及其他一些依赖于商品类型的信息: Books: title, author, num_pages Mugs: design(图案图案) Shirts: design, colors, sizes24struct catalog_item int stock_number; double price; int item_type union struct char titleTITLE_LEN+1; char authorAUTHOR_LEN+1; int num_pages; boo

13、k; struct char designDESIGN_LEN+1; mug; struct char designDESIGN_LEN+1; int colors; int sizes; shirt; item;25int item_type;/标签:指明联标签:指明联合成员具体是什么类型合成员具体是什么类型在很多程序中在很多程序中, 需要这样的变量,取值需要这样的变量,取值范围是一个很小的集合范围是一个很小的集合(有几种可能的取有几种可能的取值值). poker花色花色:“梅花梅花”,“方块方块”,“红桃红桃”和和“黑桃黑桃” CLUBS, DIAMONDS, HEARTS, SPADES

14、 院系:通信、电工、计算机、数学、外语院系:通信、电工、计算机、数学、外语 COM,EE,CS,MS,FL用枚举类型表示,用枚举类型表示, 其值由程序员列出来其值由程序员列出来 (“枚举枚举”),变量值变量值只只限于列举出来的值的范围内限于列举出来的值的范围内.每个值必须有个名字每个值必须有个名字(一个枚举常量一个枚举常量)26声明枚举标签声明枚举标签enum suit CLUBS, DIAMONDS, HEARTS, SPADES;enum suit s1, s2;typedef创建一个创建一个Suit类型名类型名typedef enum CLUBS, DIAMONDS, HEARTS, S

15、PADES Suit;Suit s1, s2;27C把枚举变量和常量当作整型处理把枚举变量和常量当作整型处理. 编译器默认将整数编译器默认将整数0, 1, 2, 赋给枚举赋给枚举中的常量中的常量. 在在suit枚举中枚举中, CLUBS, DIAMONDS, HEARTS, 和和SPADES 分别表示分别表示 0, 1, 2 和和 3(名字)(名字).28程序员可以为枚举常量选择不同的值程序员可以为枚举常量选择不同的值:enum suit CLUBS = 1, DIAMONDS = 2, HEARTS = 3, SPADES = 4;枚举常量的值可以是任意的整数枚举常量的值可以是任意的整数,

16、没没有特别的顺序有特别的顺序:enum dept RESEARCH = 20, PRODUCTION = 10, SALES = 25;两个或多个枚举常量具有相同的值甚至两个或多个枚举常量具有相同的值甚至也是合法的也是合法的.29枚举值与普通整数可以混合枚举值与普通整数可以混合:int i;enum CLUBS, DIAMONDS, HEARTS, SPADES s;i = DIAMONDS; s = 0; s+; i = s + 2;s被当作某种整型变量被当作某种整型变量.30数组数组同类型数据集合同类型数据集合 一一个班同学名单:个班同学名单:char name69NLEN+1; 一一个个

17、班同学班同学C成绩:成绩:int scores69;结构结构密切关联数据的集合密切关联数据的集合 一一个学生信息:个学生信息: 姓名、性别、学号、出身年月姓名、性别、学号、出身年月 一个同学期末成绩:一个同学期末成绩: 高高数、数、C、英语、体育、英语、体育31类型声明结构标记:struct student char nameNLEN+1;char sex;int age;char numberSLEN+1;变量声明:struct student stu1, stu2;类型声明typedeftypedef struct char nameNLEN+1;char sex;int age;char numberSLEN+1;student;变量声明:student stu1, stu2;32访问结构成员访问结构成员成员可做变量使用成员可做变量使用strcpy(, “Tom”);stu1.age = 21;puts(stu1.number);访问结构访问结构 stu2 = stu1;33定义:定义:struct student classN;访问:访问:for(i=0;inumber = 20120202012;/常用常用scanf(“%s”,p-name);scanf(“%c”

温馨提示

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

评论

0/150

提交评论