资源预览内容
第1页 / 共45页
第2页 / 共45页
第3页 / 共45页
第4页 / 共45页
第5页 / 共45页
第6页 / 共45页
第7页 / 共45页
第8页 / 共45页
第9页 / 共45页
第10页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第8章 结构体、共用体与枚举 类型本章要求: 理解结构体类型的概念,掌握结构体变量的 定义和使用 掌握结构体数组、结构体指针的定义和使用 理解共用体的概念,掌握共用体变量的定义 和使用 了解枚举数据类型及自定义数据类型的使用 理解链表的概念,初步掌握动态链表的常见 操作 本章重点: 结构体变量的定义和使用 链表的概念 本章难点: 动态链表的常见操作8.1 结构体类型与结构体变量8.1.1 结构体概述 数组是一种简单构造类型数据,数组中 的各元素是属于同一个类型的。 但在实际问题中,常会遇到这样一类数 据,它由多个类型不相同的数据项组成。 学生基本情况:学号、姓名、性别、年龄、成绩 结构体(structure)是一种数据类型 。C语言本身没有提供具体的结构体类型 ,但提供了说明结构体类型的方法。 8.1.2 结构体的声明声明结构体类型的一般形式: struct 结构体名 类型标识符 成员名 ;类型标识符 成员名 ;. ;成员类型可以是 基本型或构造型struct关 键字, 不能省略合法标识符 可省:无名结 构体struct student int num;char name20;char sex;int age; ;8.1.3 结构体变量的定义定义好一个结构体类型后,我们可以 将其看作是和int、char、float等数据类 型一样的一个新的数据类型。1.先定义结构体类型,再定义结构体变 量struct 结构体名 类型标识符 成员名;类型标识符 成员名;. ; struct 结构体名 变量名表列;struct student int num;char name20;char sex;int age; ; struct student a,b;numnamesexage2字节20字节1字节2字节int x;xastruct student t;可多次使用struct student 来定义变量2. 定义结构体类型的同时定义结构体变量struct 结构体名 类型标识符 成员名;类型标识符 成员名;. 变量名表列;struct student int num;char name20;char sex;int age; a,b; 3. 直接定义结构体变量struct student t;用无名结构体直接定 义变量只能一次8.1.4 结构体变量的引用格式 l 引用规则: 结构体变量不能整体引用, 只能引用变量成员 l 引用方式: 结构体变量名. 成员名struct student int num;char name20;char sex;int age;float score;char addr30; stu1,stu2; 成员(分量)运算符 优先级: 1 结合性:从左向右stu1.num=10; stu1.score=85.5; stu1.score+=stu2.score; stu1.age+; printf(“%d,%s,%c,%d,%f, %sn”,stu1); stu1=101,“Wan Lin”,M, 19,87.5,“DaLian”; l结构体嵌套struct date int month;int day;int year; ;struct person char name20;char sex;struct date birthday; ;若有定义:struct person person1;namesexbirthday monthdayyear合法:person1.sex=F; person1.birthday.day=35;l同类型结构体变量间的整体赋值,及变量的 初始化struct student int num;char name20;char sex;int age;float score;char addr30; stu1,stu2 ; stu1=101,“Wan Lin”,M, 19,87.5,“DaLian”; stu1=stu2; 初始化: struct student stua=101, “Wan Lin”,M,19,87.5, “DaLian”; =111,“Tom”,M,19,60, “USA”;8.1.6 指向结构体的指针指向结构体变量的指针的值是该结 构体变量所分配的存储区域的首地址。 结构指针变量的定义 struct student int num;char name20;char sex;int age; stu; struct student *p=numnamesexagestup2.通过指针访问结构体变量的成员 结构变量名.成员名(名字引用); 结构指针-成员名(指针引用); (*结构指针).成员名(将指针转化 为名字引用);struct student int num;char name20;char sex;int age; stu; struct student *p= stu.age=8; p-age=8; (*p).age=8;stu p8.2 结构体数组 8.2.1结构体数组的定义(三种形式)struct student int num;char name20;char sex;int age; ; struct student stu2;num name sex age num name sex agestu0stu125Bstu2;8.2.2 结构体数组的初始化例如:struct student int num;char name20;char sex;int age; struct student stu =100,“He Lin”,M,20,101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 引用方式: 结构体数组名下标.成员名stu0.age=8; printf(“%s”,stu1.name);8.2.3 指向结构体数组的指针struct student int num;char name20;char sex;int age; ; struct student stu9; struct student *p=stu;num name sex age num name sex agepp+1改写数组输出例子8.3 结构体与函数 已知:struct student stu1,stu10,*p=stu; l 用结构体变量的成员作参数-值传递 函数声明:void func(int x); 函数调用:func(stu1.age); l 用指向结构体指针变量或数组的指针作参 数-地址传递 或 st 函数声明:void func(struct student *st ); 函数调用:func(stu); 或 func(p); l 用结构体变量作参数-多值传递(效率 低) 函数声明:void func(struct student z); 函数调用:func(stu1);编写: 已知5个学生的信息表,包括学号、姓名 、性别、年龄。 编写函数find1,找制定学号的学生姓名 。 在主函数中输入学生学号,调用find1函 数查找学生信息。 编写函数find2,找制定姓名的学生信息 。 在主函数中输入学生姓名,调用find2函 数查找学生信息。用一个结构体的指针作为 find2函数的返回值8.4 共用体 共用体(也叫联合体)是构造数据类型, 使几个不同类型的变量共占一段内存(相互 覆盖) 1.声明结构体类型的一般形式:union 共用体名类型标识符 成员名;类型标识符 成员名;.;union data int i;char ch;float f; ;union data int i;char ch;float f; ; union data a;a1B 2B4Bi chfl共用体变量任何时刻-只有一个成员存在 l共用体变量定义分配内存,长度=最长成员所 占字节数 l共用体变量的定义形式有三种(类似结构体 变量的定义)2.共用体变量引用(类似结构体变量)union data int i;char ch;float f; a,b,d5,*p=d;a.i a.ch a.f p-i p-ch p-f (*p).i (*p).ch (*p).f d0.i d0.ch d0.f结构体 与 共用体区别: 存储方式不同 联系: 两者可相互嵌套变量的各成员 同时存在任一时刻只有 一个成员存在例8.5 枚举类型 枚举类型就是将变量可能出现的值放在 一起而形成的一个整型常量的集合类型。 限制在此集合内,变量只能取这个集合中 的某个值。 1枚举类型的定义: enum 枚举类型名 取值表; 例 enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;2枚举变量的定义与结构变量类似 (1)间接定义 例如,enum weekdays workday; (2)直接定义 例如,enum Sun,Mon,Tue,Wed,Thu,Fri,Sat workday;weekdays3说明(1)枚举型仅适应于取值有限的数据。 (2)取值表中的值称为枚举元素,枚举元素 是常量。在编译器中,按定义的顺序取值0、 1、2、.。所以枚举元素可以进行比较,比较 规则是:序号大者为大。例如,上例中的 Sun=0、Mon=1、Sat=6,所以 MonSun、Sat最大。 (3)枚举元素的值也是可以人为改变的:定 义时由程序指定。例如,如果enum weekdays Sun=7, Mon=1 ,Tue, Wed, Thu, Fri, Sat; 则Sun=,Mon=,从Tue=2开始,依次增 。例8.6 typedef的使用 功能:用自定义名字为已有数据类型命 名 简单形式: typedef type newname;类型定义语 句关键字已有数据 类型名用户定义 的类型名例 typedef int INTEGER;typedef float REAL; INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; typedef 没有创造新数据类型。 typedef是编译时处理为已有类型命名, #define是预编译时处理时简单字符置换。typedef定义类型步骤: 按定义变量方法先写出定义体,如 int i; 将变量名换成新类型名,如 int INTEGER; 他最前面加typedef,如 typedef int INTEGER; 用新类型名定义变量,如 INTEGER i,j; INTEGER i,j; int i,j; 例:1.ARRAY a; int a100; int a100; int ARRAY100; typedef int ARRAY100; ARRAY a8.7 动态数据结构链表 8.7.1 链表的提出 数组: 在内存中
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号