《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章 结构体与共用体

上传人:E**** 文档编号:89431812 上传时间:2019-05-25 格式:PPT 页数:68 大小:339.50KB
返回 下载 相关 举报
《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章  结构体与共用体_第1页
第1页 / 共68页
《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章  结构体与共用体_第2页
第2页 / 共68页
《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章  结构体与共用体_第3页
第3页 / 共68页
《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章  结构体与共用体_第4页
第4页 / 共68页
《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章  结构体与共用体_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章 结构体与共用体》由会员分享,可在线阅读,更多相关《《二级C语言程序设计及同步训练》-涂玉芬-电子教案 第九章 结构体与共用体(68页珍藏版)》请在金锄头文库上搜索。

1、第9章 结构体与共用体,9.1 结构体,上表中某一学生的数据是由学生的学号、姓名、性别、年龄、家庭地址等数据项组成的,这些数据项是一组逻辑上相关的数据,如果将这些数据项分割开来孤立地考虑它们的属性,将导致操作的不便或逻辑错误。在C语言中,将这种由多个不同类型的数据项组合在一起形成的数据类型,称为结构体类型。,表9-1 学生表,9.1.1 结构体类型的定义,结构体类型定义的一般形式: struct 标识符 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; ;,9.1.1 结构体类型的定义,例1 对某一学生数据(由学生的学号、姓名、性别、年龄、家庭地址等数据项组成)的结构体类型定义

2、如下: struct student int num; char name20; char sex; int age; char addr30; ;,(5)结构体类型定义的嵌套。 例2:若某一学生数据包括学号、姓名、性别、出生年月、家庭地址,其中出生年月包括出生的年、月、日三个数据,则对某一学生数据的结构体类型定义如下:, 再定义student结构体: struct student int num; char name20; char sex; struct date birthday; char addr30; ;, 先定义date结构体: struct date int year; int

3、 month; int day; ;,9.1.1 结构体类型的定义,9.1.2 结构体变量的定义,结构体变量的定义有三种处理方式: (1)先定义结构体类型,再定义结构体变量。 例1:struct student int num; char name20; char sex; int age; char addr30; ; /*定义结构体类型struct student */ struct student a,b; /*定义a、b为结构体类型struct student的变量*/,9.1.2 结构体变量的定义,(2)在定义结构体类型的同时定义结构体变量。 例2:struct student in

4、t num; char name20; char sex; int age; char addr30; a,b;,9.1.2 结构体变量的定义,(3)直接定义结构类型变量。 例3:struct int num; char name20; char sex; int age; char addr30; a,b;,9.1.3 结构体变量的引用,(1)引用结构体变量的成员。 格式: 结构体变量名成员名 struct date int year; int month; int day; ;,struct student int num; char name20; char sex; struct da

5、te birthday; char addr30; ; struct student a,b; a.name =“Li Fang“; b. birthday.day=12;,9.1.3 结构体变量的引用,对结构体变量中的成员都可以像同类型的普通变量一样进行各种运算。 例3:a. num=060001+5; b. birthday.day+; (2)结构体变量作为一个整体引用.结构体变量不可以作为整体进行输入输出,但可以作为函数的参数或返回值而被整体引用,也可以将一个结构体变量作为一个整体赋给另一个具有相同类型的结构体变量。 例1:struct student a,b; a=b;,(3)引用结构

6、体变量的地址或成员的地址 struct student a,b; scanf(“%d“,9.1.3 结构体变量的引用,9.1.4 结构体变量的初始化,结构体变量的初始化形式有如下两种: (1)struct 标识符 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; 变量名=数据表;,例1:struct student int num; char name20; char sex; int age; char addr30; a=060001, “Li Fang“, F,18, “Wuhan“;,(2)结构体类型名 变量名=数据表; 例2:struct student int nu

7、m; char name20; char sex; int age; char addr30; ; struct student a=060001, “Li Fang“, F,18, “Wuhan“;,9.1.3 结构体变量的引用,9.2 结构体数组,9.2.1 结构体数组的定义 结构体数组定义的一般形式: 结构体类型名 数组名常量表达式; 例1:struct student int num; char name20; char sex; int age; char addr30; ; /*定义结构体类型struct student */ struct student a5; /*定义a5结构

8、体类型struct student的数组*/,9.2.2 结构体数组元素的引用,格式:结构体数组名元素下标.结构体成员名 例1:struct student int num; char name20; char sex; int age; char addr30; a5; a0. num=060001; a1. name=“Lin Hong“;,一个结构体数组元素相当于一个结构体变量,其处理方法与结构体变量的处理方法相同,9.2.2 结构体数组元素的引用,例2:struct student int num; char name20; char sex; int age; char addr30

9、; a5; scanf(“%d“,9.2.3 结构体数组的初始化,结构体数组也可以在定义的同时进行数组元素的初始化。 例如:struct student int num; char name20; char sex; int age; char addr30; a5= 060001, “Li Fang “, F,18, “ Wuhan “,060230, “Lin Hong “, F,16, “ Changsha “; ,;,9.2.4 应用举例,例9.1 输入如表9-1所示的学生情况登记表,按学号顺序整理输出该表。 分析如下: 1、定义学生类型及学生数组: 2、输入学生信息 3、输出学生信息

10、 (程序由学生和老师共同完成),struct student int num; char name20; char sex; int age; char addr30; a5;,9.3 结构体指针,结构体指针变量:如果用一个指针变量指向一个结构体变量,即存储该结构体变量所占据的内存单元的起始地址,则该指针变量称为结构体指针变量。 结构体指针变量也可以用来指向结构体数组中的元素。,9.3.1 结构体指针变量的定义,结构体指针变量的定义形式如下: 结构体类型名 *指针变量名; 例如:struct student *p,a; p=,9.3.2 引用指针所指向的结构体变量的成员,通过指针变量引用结构体

11、变量的成员有如下两种方式: (1)(*结构体指针).成员名 例如:(* p).num (2)结构体指针-成员名 例如:p- num,9.3.3 指向结构体数组的指针,对于已定义的结构体数组,若用一个变量来存放该结构体数组在内存中的首地址,则该变量为指向结构体数组的指针变量。 例如:struct student *p,a5; p=a; 例9.2 用指向结构体数组的指针处理例9.1(按学号顺序整理输出学生情况登记表。),9.4 结构体与函数,1结构体变量作为函数的形参的三种形式: (1)以结构体变量的成员作为参数,传递结构体变量的成员的值。 (2)以结构体变量作为参数,直接传递结构体变量的值。 在

12、ANSI C标准中允许用结构变量作为函数的参数进行整体传送,即直接将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成员。注意,实参与形参必须是相同结构体类型的变量。 (3)以结构体指针作为参数,传递结构体变量的地址。 通过结构体变量的整体传递可以实现函数参数的传递,但这要将结构体变量的全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。 因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传递给函数形参的只是地址,从而减少了时间和空间的开销。,例9.3 利用函数完成结构体变量的输入输出。 (阅读书中程序) 2结构体类型作为函

13、数的返回值类型 其一般定义形式: 结构体类型名 函数名(形参表) 函数体 例(p168),9.4 结构体与函数,9.5 链表,C语言中,变量存储空间的分配分为静态分配和动态分配两种方式。 (1)静态分配方式:先在程序的声明部分进行定义,然后在程序编译时分配适当的存储单元。这些存储单元一经分配,在它的生存期内是固定不变的。 (2)动态分配方式:在程序执行期间,通过“申请”分配指定的存储空间来存储数据,当有闲置不用的存储空间时,又可以随时将其释放。 前面章节中处理的变量都是在程序的声明部分定义的变量,在程序编译时分配存储单元,是静态分配方式。本章下面要介绍的是通过动态分配方式,在程序执行期间,通过

14、“申请”分配的动态的存储单元,以及动态分配的存储单元构成的“链表”结构。,9.5.1 链表的概念,例1:利用C语言在计算机中存储三个学生的计算机成绩,如果有定义int a3,则其内存单元分配情况如下:,9.5.1 链表的概念,例2:用链表存储方式来存储三个同学的计算机成绩。,可直观地表示如下:,9.5.2 动态分配函数,1malloc函数 函数格式: void *malloc(unsigned int size) 函数功能:在内存的动态存储区中分配一个长度为size的存储单元。 例1:int *p; long *lp; struct student *head; p=(int *)malloc

15、(2); /*分配一个整型存储单元(占用2个字节),用p指向该存储单元*/ lp=(long *)malloc(sizeof(long); /*分配一个长整型存储单元,用lp指向该存储单元,长整型存储单元所占字节数由函数sizeof(long)求得*/ head=(struct student *)malloc(sizeof(struct student); /*分配一个struct student结构体类型的存储单元,用head 指向该存储单元*/ 上述函数sizeof(类型名)求出指定类型的存储单元所占字节数,9.5.2 动态分配函数,2calloc函数 函数格式: void calloc(unsigned int n,unsigned int size); 函数功能:在内存的动态存储区域中分配n个长度为size的连续存储单元。形参n和size均为无符号整数,n是连续存储单元的个数,size是一个存储单元占用的字节数。函数的返回值为分配的连续存储单元的起始地址;如果分配不成功,则返回值为0。 例2:int *p; p=(int *)calloc(3,sizeof(int); /*分配3个连续的存储单元,并将其起始地址赋给整型指针变量p*/,9.5.2 动态分配函数,3free函数 函数格式: void free(void *ptr); 函数功能:释放由指针变量

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号