第8章结构体、共用体与枚举类型.ppt
《第8章结构体、共用体与枚举类型.ppt》由会员分享,可在线阅读,更多相关《第8章结构体、共用体与枚举类型.ppt(54页珍藏版)》请在三一文库上搜索。
1、第8章 结构体、共用体与枚举类型,本章要求:,理解结构体类型的概念,掌握结构体变量的定义和使用; 掌握结构体数组、结构体指针的定义和使用; 理解链表的概念,掌握动态链表的常见操作; 理解共用体的概念,掌握共用体变量的定义和使用。,本章重点: 动态链表的常见操作,本章难点: 动态链表的常见操作,第8章 结构体、共用体与枚举类型,8.1 结构体类型与结构体变量 8.2 结构体数组 8.3 结构体与函数 8.4 动态数据结构链表 8.5 共用体 8.6 枚举类型 8.7 自定义类型标识符(typedef),第8章 结构体、共用体与枚举类型,8.1 结构体 C语言提供一种能集中不同数据类型于一体的数据
2、类型结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体自定义数据类型,8.1 结构体类型与结构体变量,8.1.1 什么是结构体类型,第4章学习的数组是一种简单构造类型数据,数组中的各元素是属于同一个类型的。但在实际处理的问题中,常会遇到这样一类数据,它由多个属性各不相同的数据项组成,各个数据项用来描述一个共同的对象。 结构体(structure)是一种数据类型。C语言本身没有提供具体的结构类型,但提供了说明结构体类型的方法。,8.1.2 结构体的声明,声明结构体类型的一般形式:,struct 结构体
3、名 结构成员1; 结构成员2; 结构成员n; ;,8.1 结构体类型与结构体变量,例如:定义一个可描述学生基本情况的结构体类型如下: struct student int num; char name20; char sex; int age; float score; ;,8.1 结构体类型与结构体变量,例 struct student int num; char name20; char sex; int age; float score; ; struct student stu1,stu2;,8.1.3 结构体变量的定义 定义好一个结构体类型后(也可以理解为是我们用户自己定义的类型),
4、我们可以将其看作是和int、char、float等数据类型一样的一个新的数据类型,可以用它定义变量,通过变量对结构体中各成员的数据进行处理。 1.先定义结构体类型,再定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 变量名表列;,8.1 结构体类型与结构体变量,2. 定义结构体类型的同时定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct student int num; char name20; char sex; int age; fl
5、oat score; stu1,stu2;,8.1.3 结构体变量的定义,3. 直接定义结构体变量 一般形式:,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct int num; char name20; char sex; int age; float score; stu1,stu2;,8.1.3 结构体变量的定义,8.1.3 结构体变量的引用,1结构体变量的引用格式 结构体变量名.成员名 其中:“.”是成员运算符,它在所有的运算符中优先级最高。 例如,对上小节定义的学生情况结构体变量stu1变量进行赋值: stu1.num=10001; str
6、cpy(stu1.name,”zhang”); stu1.sex=M; stu1.age=19; stu1.score=88; 不能把结构变量作为整体进行输入输出: scanf(“%d%s%c%d%f”,stu1); 正确的引用方式可以是: gets(stu1.name); scanf(“%d%c%d%f”,2结构体嵌套时逐级引用,struct date int month; int day; int year; ;,struct person char name20; char sex; struct date birthday; ;,若有定义: struct person person1;
7、 这时可以这样访问person1中的成员month: person1.birthday.month,8.1.3 结构体变量的引用,8.1.3 结构体变量的引用,3 3. 同类型结构体变量间的整体赋值,结构体变量可以通过整体赋值,将一个结构体变量中的所有数据,赋给另一个结构体类型相同的结构体变量中对应的数据成员。,例8-1 建立一个学生的基本情况表,然后将其打印输出。 程序如下:,#include #include main() struct student int num; char name20; char sex; int age; float score; stu1,stu2; stu1
8、.num=10001; strcpy(stu1.name,“zhang“); stu1.sex=M; stu1.age=19; stu1.score=88; stu2=stu1; printf(“stu1:%d,%s,%c,%d,%6.2fn“,stu1.num,stu1.name, stu1.sex,stu1.age,stu1.score); printf(“stu2:%d,%s,%c,%d,%6.2fn“,stu2.num,stu2.name, stu2.sex,stu2.age,stu2.score); ,程序输出结果如下: stu1:10001,zhang,M,19,88.00 stu
9、2:10001,zhang,M,19,88.00,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; float score; stu1=10001,“zhang“,M,19,88;,8.1.4 结构体变量的初始化,形式:,8.1.6 指向结构体的指针,指向结构体变量的指针的值是该结构体变量所分配的存储区域的首地址。,结构指针变量的定义,例:struct student int num; char name20; char sex; i
10、nt age; float score; stu1=10001,”zhang”,M,19,88; struct student *p=stu1;,8.1.6 指向结构体的指针,通过指针访问结构体变量的成员,结构变量中简单成员的引用形式有下面三种: 结构变量名.成员名(名字引用); 结构指针-成员名(指针引用); (*结构指针).成员名(将指针转化为名字引用);,例:若有定义:struct student *p,stu1;且p= 则要访问stu1的成员(如age)有下三种方式: stu1.age 或 p-age 或 (*p).age,8.2 结构体数组,8.1.1结构体数组的定义,结构体数组的定
11、义方式同结构体变量一样,也有3种方法,只需把结构体变量换成结构体数组即可。,例:struct student int num; char name20; char sex; int age; float score; ; struct student stu10;,结构体数组的初始化,与通常数组的初始化类似。例如: struct student int num; char name20; char sex; int age; float score; stu4= 10001,“ Zhang “,M,19,80,10002,“ Li “,M,18,78, 10003,“He“,F,20,92.5
12、,10004,“Cheng“,F,18,70;,结构体数组的初始化,8.2 结构体数组,结构体数组引用方式: 结构体数组名下标.成员名 例:stu1.age+,8.2.2 结构体数组与指针,指向结构体数组的指针的值是该结构体数组所分配的存储区域的首地址。,例: struct student int num; char name20; char sex; int age; float score; ; struct student *p; struct student stu10; p=stu;,p就是指向结构体数组stu的指针(如右图所示),8.2.3 结构体数组的应用实例,例8-3,#def
13、ine N 10 #include #include struct student /*定义student结构体类型*/ int num; char name20; float score3; ; main() int i,j; struct student stuN; for(i=0;iN;i+) /*用for循环输入10名学生的信息*/ scanf(“%d,%s“, ,例8-4:用指向结构体数组的指针改写例8-3,#define N 10 #include #include struct student int num; char name20; float score3; main()
14、int i,j; struct student *p,stuN; p=stu; for(i=0;inum); printf(“%s“,p-name); printf(“%6.1f,%6.1f,%6.1fn“,p-score0,p-score1,p-score2); ,8.3 结构体与函数,结构体类型的变量可以作函数的形参,调用时C直接把同类型结构体实参变量的各个数据成员的值全部复制给形参的结构体变量。为了提高效率和通用性,可以用指向结构体变量(或数组)的指针作为函数的形参。函数也可以返回结构体类型数据到主调函数中。,8.3.1 结构体变量作函数参数,例8-5 在例8-3中,10名学生的信息输出
15、改为通过调用print函数完成。,void print(struct student stu) printf(“%d,%s,%6.1f,%6.1f,%6.1fn“,stu.num,stu.name, stu.score0,stu.score1,stu.score2); ,#define N 10 #include #include struct student ; main() int i,j; struct student stuN; void print(struct student stu); for(i=0;iN;i+) print(stui);/调用print函数,8.3.2 返回结
16、构体的函数,例8-6 建立10名学生的信息表,每个学生的数据包括学号、姓名、及三门课的成绩。输出总分最高的学生记录,要求将查找该记录的过程编制为函数。,/查找最高分学生的记录函数,返回值为指向该记录的指针 student *search_max(student *x,int n) int i,k=0; for(i=1;ixk.sum)k=i; return x+k; ,8.4 动态数据结构链表,8.4.2 链表的基本结构,1 头指针(head) 是一个指针变量,用来存放链表中第一个结点的地址。 2 链表中每一结点一般由两大部分组成: (1)数据域,用于存放用户需要用的实际数据,可以是一个数据项
17、,也可以是多个数据项。 (2)指针域,用于存放和该结点相链接的下一个结点的地址,一般通过一个指针变量来实现。 3尾结点 最后一个结点因其后续无结点,该指针域不再指向其他结点,它称为尾结点,它的地址部分存放一个“NULL”(表示空地址),链表到此结束。,8.4 动态数据结构链表,8.4.3 链表结点的定义,链表结点数据可以用结构体来描述,如图8-4所示中的链表结点就可通过结构体定义如下: struct student int num; float score; struct student *next; ; 以上定义了一个结构体student类型,student类型数据包括3个数据成员:int类
18、型num、float类型的score和指向另一个student类型数据的指针变量next。,8.4.4 动态存储空间的建立和释放,1动态存储空间的建立 (1)malloc函数,其函数原型为: void *malloc(unsigned int size); 其作用是在内存的动态存储区中分配一个长度为size的连续空间。,(2)sizeof(type)运算符 计算所给数据类型type的字节数,主要用来计算链表中结点所占动态存储空间的字节数。,(3)calloc函数,其函数原型为: void *calloc(unsigned n,unsigned size); 其作用是在内存的动态区存储中分配n个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 枚举 类型
链接地址:https://www.31doc.com/p-3435674.html