C语言_第11章.ppt

上传人:少林足球 文档编号:4134645 上传时间:2019-10-21 格式:PPT 页数:41 大小:2.59MB
返回 下载 相关 举报
C语言_第11章.ppt_第1页
第1页 / 共41页
C语言_第11章.ppt_第2页
第2页 / 共41页
C语言_第11章.ppt_第3页
第3页 / 共41页
C语言_第11章.ppt_第4页
第4页 / 共41页
C语言_第11章.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C语言_第11章.ppt》由会员分享,可在线阅读,更多相关《C语言_第11章.ppt(41页珍藏版)》请在三一文库上搜索。

1、第十一章 结构体和 共用体,第十一章 结构体和共用体,11.1 结构体 11.2 结构体数组 11.3 结构体指针 11.4 结构体的嵌套 11.5 链表 11.6 链表相关操作 11.7 共用体 11.8 枚举类型 11.9 实战练习,本章学习内容,11.1.1 结构体类型的概念,结构体类型可以由若干“成员”构成,其中每一个成员可以是一个基本数据类型或构造类型。 结构体是一种新的类型,这种类型需要先进行构造,构造操作称为定义结构体类型。 例如:学生这种类型,包含姓名、学号、性别、成绩。,11.1.1 结构体类型的概念,定义结构体的一般形式: struct 结构体名 成员列表 ; 成员列表形式

2、为:类型说明符 成员名; 成员之间使用分号分隔,例如: struct student int num; char name20; char sex; float score; ;,11.1.2 结构体变量的定义,定义结构体类型后,可以将某个变量定义为该结构体变量,定义一个结构体变量有3种方法 1. 先定义结构体,再定义结构体变量 struct student /*定义结构体类型*/ int num; char name20; char sex; float score; ;,11.1.2 结构体变量的定义,struct student stu1; /*使用结构体名定义变量stu1*/ stru

3、ct student stu2; /*使用结构体名定义变量stu2*/ 注意: 定义一个基本类型的变量与定义结构体类型变量的不同之处在于:定义结构体变量不仅要求变量为结构体类型,而且要求制定为某个特定的结构体类型,如struct student;而定义基本类型的变量时,如整型变量,只需要指定int类型即可,11.1.2 结构体变量的定义,2. 定义结构体类型时,同时定义变量 struct student int num; char name20; char sex; float score; stu1, stu2; /*多个变量名之间使用逗号分隔*/,11.1.2 结构体变量的定义,3. 直接

4、定义结构体类型变量 struct /*直接定义结构体变量,省略结构体类型名*/ int num; char name20; char sex; float score; stu1, stu2; /*多个变量名之间使用逗号分隔*/,11.1.2结构体变量的定义,说明 (1)结构体中的成员名与其他变量名同名时,互不干扰。 (2)在规模较大的程序便于修改和使用,常常将结构体类型的定义放在一个头文件中,这样其他源文件如果需要使用该结构体类型,可以使用#include命令将头文件包含进来。 (3) 结构体类型student就好比基本类型int,它是类型名,而不是变量名;只能对变量进行赋值操作,而不能对类

5、型进行操作。系统在编译时,对类型是不分配内存空间的,而定义结构体变量时,系统会为其分配内存单元,例如stu1、stu2在内存中各占41个字节(num占4个字节,name占20个字节,sex占1个字节,birthday占12个字节,score占4个字节)。实际上,为了方便访问成员的内存地址,系统会对结构体所占内存空间的大小进行优化,通常取4的倍数,11.1.2 结构体变量的定义,(4) 结构体类型student就好比基本类型int,它是类型名,而不是变量名;只能对变量进行赋值操作,而不能对类型进行操作。系统在编译时,对类型是不分配内存空间的,而定义结构体变量时,系统会为其分配内存单元,例如stu

6、1、stu2在内存中各占41个字节(num4字节,name20字节,sex1字节,birthday12字节,score4字节)。实际上,为了方便访问成员的内存地址,系统会对结构体所占内存空间的大小进行优化,通常取4的倍数,11.1.3 结构体变量的引用,引用结构体变量中的成员的一般形式:结构体变量名.成员名 , 例如: stu1.num = 10134; stu1.name = “Liming”; stu2.num = 10135; stu2.name = “Wangrui”; 结构体变量成员的引用,可以与普通变量一样使用 成员运算符”.”优先级最高,stu1.num+是对stu1.num进行

7、自增运算,而不是对num进行自增运算,11.1.4 结构体变量的初始化,一般形式: struct 结构体类型名 结构体成员列表; 变量名 = 初始化列表;,例如: struct student int num; char name20; char sex; float score; stu = 10345, “Liming”, m, 75.5; 初始化时,初始化值类型要与成员的类型一一对应,11.2.1 定义结构体数组,一般形式: struct 结构体名 成员列表; 数组名;,三种定义形式,定义结构体类型的同时定义结构体数组,例如: struct student int num; char n

8、ame20; char sex; float score; stu5;,11.2.1 定义结构体数组,先定义结构体类型,再定义结构体数组,例如: struct student int num; char name20; char sex; float score; ; struct student stu5;,11.2.1 定义结构体数组,不指定结构体类型名,直接定义结构体数组,例如: struct int num; char name20; char sex; float score; stu5;,11.2.1 定义结构体数组,存储形式:,11.2.2 初始化结构体数组,一般形式: stru

9、ct 结构体名 成员列表; 数组名 = 初始化列表;,struct student int num; char name20; char sex; flost score; stu5 = 10345, “Liming”, m, 75.5, 10346, “Wangrui”, m, 85.0, 10347, “Zhangmeng”, f, 80.0, 10348, “Hanlu”, f, 95.0, 10349, “YuJiaqi”, m, 91.5 ;,11.2.2 初始化结构体数组,struct student int num; char name20; char sex; flost sc

10、ore; stu = /*未指定数组元素个数*/ 10345, “Liming”, m, 75.5, 10346, “Wangrui”, m, 85.0, 10347, “Zhangmeng”, f, 80.0, 10348, “Hanlu”, f, 95.0, 10349, “YuJiaqi”, m, 91.5 ;,11.2.2 初始化结构体数组,说明 结构体数组元素的引用和普通数组元素一样,使用中括号和下标来表示:stui表示第i个元素,数组元素的成员引用和普通结构体变量的成员引用一样使用成员运算符“.”引用:stui.num表示第i个元素的学号,11.3.1 指向结构体变量的指针,可以定

11、义一个结构体的指针变量,指向一个结构体变量,通过指针来访问结构体变量中的各个成员。 定义结构体指针的一般形式为: 结构体类型 *指针名; 例如: struct student stu; struct student *p; p = ,11.3.1 指向结构体变量的指针,使用结构体指针访问结构体成员的方法有两种 1. 使用成员运算符“.”引用结构体成员 (*pStruct).成员名; 例如: (*p).num = 10345; /* p指向的结构体变量的成员num赋值为10345 */ 使用成员运算符“.”时,必须保证运算符前面是一个结构体变量,由于成员运算符“.”的优先级高于“*”,所以*p必

12、须要加上括号。,11.3.1 指向结构体变量的指针,2. 使用指针运算符“-”引用结构体成员 pStruct-成员; 例如: p-num = 10345; /*使用指针运算符引用stu成员num*/ 所以假设有: struct student stu; struct student *p = ,11.3.1 指向结构体变量的指针,注意 指针运算符“-”的优先级同成员运算符“.”一样,优先级最高,与自增运算符一起使用时,指针运算符“-”同成员运算符“.”的运算规则相同,假设有: sturct student stu, *p; p = 那么p-num+与stu.num+等价:先访问成员变量num,

13、使用num的值完成运算后,再对num的值执行自增1的操作; +p-num与+stu.num等价:先访问成员变量num,对num的值执行自增1的操作后,在使用num自增后的值参与运算。,11.3 结构体指针,结构体指针变量不仅可以指向一个结构体变量,还可以指向结构体数组,此时指针变量的值是结构体数组的首地址 struct student int num; char name20; char sex; float score; ; struct student stu5; struct student *p = stu; /*结构体数组名赋给指针p*/,11.3.3 结构体作为函数参数,1. 使用

14、结构体变量作为函数参数 采用“值传递”方式,将实参结构体变量的内容按照定义顺序拷贝给形参变量 例如:void display(struct student stu);,2. 使用结构体变量的指针作为函数参数 将实参结构体变量的地址传给函数形参 void display(strcut student *p); 不需要拷贝整个结构体变量,只需要拷贝一个4字节的地址,3. 使用结构体变量的成员作为函数参数 与普通基本类型变量同样使用,11.4 结构体的嵌套,结构体成员不仅可以是基本数据类型,还可以是结构体类型,称为结构体的嵌套。 例如:,11.4 结构体的嵌套,struct date int yea

15、r; int month; int day; ; struct student int num; char name20; char sex; struct date birthday; /*成员也是结构体类型*/ float score; stu1, stu2; /*定义结构体变量*/,11.4 结构体的嵌套,对于嵌套的结构体变量,需要使用成员运算符“.”逐级找到最低级的成员,引用的方式如下: stu1.birthday.year = 1994; stu1.birthday.month = 9; stu1.birthday.day = 15;,11.5.1 链表概述,定义一个结构体,包括数据

16、域、指针域两个成员 其中指针域用来存放下一个结点的地址,这样将多个结点串连起来,组成链表,11.5 链表,例如,存放学生信息(包括学号、姓名)的结点应该为以下结构。 struct student int num; int score; struct student *next; ; 链表的基本操作主要有:建立链表、结点的输出、插入一个结点、删除一个结点,11.5.2 创建链表,1malloc()函数功能是在内存中动态的分配一块size大小的存储空间,返回该存储空间的首地址,如果分配出错,则返回NULL。 void *malloc(unsigned int size); 2. calloc()函

17、数功能是在内存中动态分配n个长度为size的连续内存空间,返回这段内存空间的首地址,如果分配出错,则返回NULL。 void *calloc(unsigned int n, unsigned int size); 3. free()函数功能是释放由指针ptr指向的内存空间,ptr一般是由malloc()函数或calloc()函数动态分配的返回地址,free()函数没有返回值 void free(void *ptr);,11.6.1 插入操作,插入操作分三种情况:在链表的第一个结点前插入新的结点;在链表中间结点的前面或后面插入新的结点;在链表的最后一个结点后面插入新的结点,11.6.2 删除操作

18、,删除操作分两种情况:删除指定下标的结点和删除指定数据域的结点,11.7.1 共用体的概念,共用体也称为联合体,在共用体中,所有的成员在内存中具有相同的首地址,共占同一段内存空间,这些数据可以相互覆盖,也就是说再某一时刻,只有最新存储的数据是有效的。运用这种数据类型的优点是节省存储空间。 共用体类型定义的一般形式为: union 共用体名 成员列表; 变量列表;,11.7.1 共用体的概念,例如: union uType int m1; char m2; float m3; ; 其中uType是共用体类型名。 共用体变量的定义方法和成员引用同结构体变量,这里不再详述,11.7.2 共用体变量的

19、初始化,共用体变量和结构体变量的存储结构不同,共用体变量的成员是公用一个首地址相同的内存空间,所以在任意时刻只能存放其中一个成员的值,也就是说,在每一个时刻,共用体变量只有一个成员起作用,所以在对共用体变量定义并初始化时,只能对第一个成员赋初值,初值使用大括号括起来,所以uType的变量初始化应该如下: union uType a = 45;,11.7.3 共用体类型的数据特点,1同一个内存段可以用来存放几种不同类型的成员,但是每一次只能存放其中的一种,而不是同时存放所有的类型,也就是说在共用体类型的变量中,只有一个成员起作用。 2共用体变量中起作用的成员是最后一次存放数据的成员,在存入一个新

20、成员的数据后,原来起作用的成员将会失效。 3共用体变量的地址和它的各个成员的地址是相同的。 4不能对共用体变量的整体赋值,也不能企图引用变量名来得到一个值。,11.8 枚举类型,利用关键字enum可以声明枚举类型,这也是一种数据类型。使用该类型可以定义枚举类型变量,一个枚举变量包含一组相关的标识符,其中每个标识符都对应一个整数值,称为枚举常量。 枚举类型定义的一般形式为。 enum 枚举类型名 枚举值表 ; 例如: enum ShapeTrangle, Square, Pentagon; Shape就是枚举类型,在括号中的第一个标识符对应数值为0,第二个对应1,以此类推。,11.8 枚举类型,

21、在定义枚举类型时,可以为某个特定的标识符指定其对应的整型值,紧随其后的标识符对应的值依次加1,例如: enum ShapeTrangle = 1, Square, Pentagon; 此时,Trangle的值为1,Square的值为2,Pentagon的值为3。 定义好枚举类型后,可以定义该枚举类型的变量,如下。 enum Shape shape; shape是枚举类型Shape的变量。 也可以在定义枚举类型时同时定义枚举变量,如下。 enum ShapeTrangle = 1, Square, Pentagon shape; shape是枚举类型Shape的变量。 当然,也可以在定义枚举类型时,不指定类型名,直接定义枚举变量,如下。 enum Trangle = 1, Square, Pentagon shape;,11.9 实践练习,1定义一个结构体变量,成员包括职工号,姓名,性别,工资。要求: (1)从键盘输入一个数据,放到一个结构体变量中,并输出。 (2)定义一个结构体数组,存放N个职工信息,计算所有职工工资的总和,并输出。 2定义一个结构体变量,成员包括学生的学号,姓名,和三门课的成绩,通过键盘输入一个学生的信息,并输出。 3定义一个结构体数组,其中元素是一个结构体变量,成员包括学生的学号、姓名和三门课的成绩,求该数组中N个学生的每一门课的平均成绩。,END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1