结构体、联合体和枚举类型.ppt
《结构体、联合体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《结构体、联合体和枚举类型.ppt(106页珍藏版)》请在三一办公上搜索。
1、,本章导读 结构体、联合体、枚举类型都是用户自己定义的数据类型,这些类型的数据是用户根据实际需要来组织的。结构体和联合体都是构造类型的数据,枚举类型是基本类型的数据。,C语言程序设计(Visual C+6.0环境),返回本书目录,第7章 结构体、联合体和枚举类型,本章主要知识点(1)结构体类型数据的定义,结构变量的说明及引用方法 结构指针的定义、使用以及结构指针在C程序中的应用链表的建立、输出、删除与插入等操作(2)联合体类型数据的定义,联合变量的说明及引用方法(3)枚举类型数据的定义,枚举变量的说明及引用方法(4)了解自定义类型的概念和类型定义方法及应用,第7章 结构体、联合体和枚举类型,C
2、语言程序设计(Visual C+6.0环境),返回本章导读,7.1 结构体,7.2 联合体,7.3 枚举类型,7.4 自定义类型,7.5 综合实训,C语言程序设计(Visual C+6.0环境),返回本章目录,7.1 结构体,7.1.1 结构体与结构变量,7.1.2 结构成员的引用,7.1.3 结构数组,7.1.4 结构指针与链表,7.1.1 结构体与结构变量,C语言程序设计(Visual C+6.0环境),返回本节目录,“结构体”是一种构造类型,是由数目固定,类型相同或不同的若干有序变量组成的集合。组成结构体的每个数据都称为结构体的“成员”,或称“分量”。,返回本节目录,1结构体类型的声明,
3、2结构变量的定义,3结构体类型与结构变量,1结构体类型的声明,C语言程序设计(Visual C+6.0环境),返回7.1.1目录,声明一个结构体类型的一般形式为:struct 成员表列(也称为域表);应注意在括号后的分号是不可少的。成员表列由若干个成员组成,每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形式为:;成员名的命名应符合C语言标识符的书写规定,结构体成员名可与程序中其它变量同名,互不干扰。,2结构变量的定义,C语言程序设计(Visual C+6.0环境),返回7.1.1目录,对于已经声明的结构体类型,就可有对应于该类型的“结构类型变量”,简称为“结构变量”。定义结
4、构变量有以下三种方法:(1)先声明结构体类型,再定义结构变量 即在先前声明的结构体类型后加上以下形式:struct;(2)在声明结构体类型的同时定义结构变量 即被定义的结构变量直接在结构体类型声明的“”后给出。一般形式为:struct 成员表列 结构变量表列;(3)直接定义结构变量 即省略结构体名。一般形式为:struct;,3结构体类型与结构变量,C语言程序设计(Visual C+6.0环境),返回7.1.1目录,结构体类型与结构变量的最大区别在于:结构变量占有一定的内存空间,而结构体类型只是一种数据类型的结构描述,并不占用内存空间。struct box float length;float
5、 width;float height;它表明struct box结构体类型由大括号中所列的一些数据项组成,共需占用4x3=12个字节。在此之后,若进行结构变量的定义如:struct box box1;表明box1为struct box结构体类型变量,它占用了12个字节的内存单元。,7.1.2 结构成员的引用,C语言程序设计(Visual C+6.0环境),返回本节目录,对结构变量的访问是通过对结构变量各个成员的访问来进行的,结构变量成员描述为:.在引用中应遵循以下原则:(1)如果成员本身又是一个结构体类型时,则必须逐级找到最低一级的成员才能使用。(2)对成员变量的使用与普通变量完全相同,可根
6、据其类型进行相应的运算。(3)可以引用成员的地址,也可以引用结构体变量的地址。(4)允许将一个结构变量直接赋值给另一个具有相同结构的结构变量。,【例7.1】,例7.1(1),C语言程序设计(Visual C+6.0环境),返回7.1.2目录,【例7.1】利用结构体对三名学生的学号、姓名、性别、成绩进行输入与输出。程序名为l7_1.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student1,student2=960002,Zhang hong li,W,98,student3;/*对s
7、tudent2初始化*/main()student1.num=960001;/*对student1各成员赋值*/scanf(%s,student1.name);student1.sex=M;student1.score=65;student3=student1;/*对student3直接赋值*/,例7.1(2接上页),C语言程序设计(Visual C+6.0环境),返回7.1.2目录,printf(n%ldt%20st%ct%f,student1.num,student1.name,student1.sex,student1.score);printf(n%ldt%20st%ct%f,stud
8、ent2.num,student2.name,student2.sex,student2.score);printf(n%ldt%20st%ct%f,student3.num,student3.name,student3.sex,student3.score);运行情况如下:输入:Lilin960001 Lilin M 65960002 Zhang hong li W 98960001 Lilin M 65,程序演示,例7.1程序演示,返回例题,返回7.1.2目录,7.1.3 结构数组,C语言程序设计(Visual C+6.0环境),返回本节目录,数组元素是结构体类型数据,这时的数组就是结构数
9、组。,1结构数组的定义,2.结构数组的初始化,【例7.2】,1结构数组的定义,C语言程序设计(Visual C+6.0环境),返回7.1.3目录,结构数组的定义方法和结构变量相似,只需说明它为数组类型即可。例如:struct stu int num;char name20;char sex;float score;struct stu student3;也可以直接定义一个结构数组或省略结构体名。,2.结构数组的初始化,C语言程序设计(Visual C+6.0环境),返回7.1.3目录,对结构数组可以进行初始化,它的作用在于把成批的数据传递给结构数组中的各个元素。初始化的一般形式为:struct
10、 n=;其中,n为元素的个数。在初始表列中,以一个元素内容为单位,用一对“”括起来,各元素之间用“,”分隔。当对数组中的全部元素初始化时,也可将“”中的数组元素个数省略。在编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。数组的初始化也可以先声明结构体类型,然后再定义数组为该结构体类型,并在定义数组时初始化。,【例7.2】(1),C语言程序设计(Visual C+6.0环境),返回7.1.3目录,【例7.2】计算学生的平均成绩并统计出不及格的人数。程序名为l7_2.cpp。#include stdio.hstruct stu long int num;char name20;c
11、har sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liu ying,W,50;main()int i,n;float average,sum;n=0;sum=0;,【例7.2】(2上接1),C语言程序设计(Visual C+6.0环境),返回7.1.3目录,for(i=0;i3;i+)sum+=studenti.score;if(studenti.score60)n+=1;printf(sum=%fn,sum);average=sum/3;printf(average=%fncount=%dn,
12、average,n);运行情况如下:sum=234.000000average=78.000000count=1.,程序演示,【例7.2】程序演示,返回例题,返回7.1.3目录,7.1.4 结构指针与链表,C语言程序设计(Visual C+6.0环境),返回本节目录,1结构指针,2链表,1结构指针,C语言程序设计(Visual C+6.0环境),返回7.1.4目录,我们把指向结构体的指针称为结构指针,它是一个指针变量。结构指针变量说明的一般形式为:struct*;这样说明的含义是:一规定了指针的数据特性;二为结构指针本身分配了一定的内存空间。结构指针变量必须要先赋值后才能使用,赋的值应是一个地
13、址值。有了结构指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为:.或为:-,1结构指针,C语言程序设计(Visual C+6.0环境),返回7.1.4目录,在结构指针的使用中可分为以下几种情况:,(3)结构指针作函数参数,(1)指向结构变量,(2)指向结构数组,(1)指向结构变量,C语言程序设计(Visual C+6.0环境),返回1目录,当使用结构指针指向一个结构变量时,指针变量中的值就是所指向的结构变量的首地址。这三种用于表示结构成员的形式是完全等效的。结构变量.成员名(*结构指针变量).成员名 结构指针变量-成员名 请注意分析下面几种运算:s-n 得到s指向的结构变量中的
14、成员n的值 s-n+得到s指向的结构变量中的成员n的值,用完该值后使 它加1+s-n 得到s指向的结构变量中的成员n的值使之加1,【例7.3】,【例7.3】(1),C语言程序设计(Visual C+6.0环境),返回(1),【例7.3】通过结构指针引用结构体成员。程序名为l7_3.cpp。#include stdio.hstruct stu int num;char name20;char sex;float score;student1=102,Zhang ping,M,78.5,*s;main()s=,【例7.3】(2上接1),C语言程序设计(Visual C+6.0环境),返回(1),运
15、行情况如下:Number=102Name=Zhang pingSex=MScore=78.500000Number=102Name=Zhang pingSex=MScore=78.500000Number=102Name=Zhang pingSex=MScore=78.500000,程序演示,【例7.3】程序演示,返回例题,返回(1),(2)指向结构数组,C语言程序设计(Visual C+6.0环境),返回1目录,当结构指针指向一个结构数组时,该指针变量的值是整个结构数组的首地址。当然结构指针也可以指向结构数组中的某个元素,这时指针变量的值是该结构数组元素的首地址。设s为指向结构数组的指针变量
16、,则s也指向该结构数组的0号元素,s+1指向1号元素,s+i则指向i号元素。,【例7.4】,【例7.4】(1),C语言程序设计(Visual C+6.0环境),返回(2),【例7.4】用指针变量输出结构数组。程序名为l7_4.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liuying,W,50;main()struct stu*s;printf(NumtNamettSextSc
17、oretn);for(s=student;snum,s-name,s-sex,s-score);,【例7.4】(2上接1),C语言程序设计(Visual C+6.0环境),返回(2),运行情况如下:NumNameSexScore200001 Li li W99.000000200002Wang haiM85.000000200003Liuying W50.000000.,程序演示,【例7.4】程序演示,返回例题,返回(2),(3)结构指针作函数参数,C语言程序设计(Visual C+6.0环境),使用结构指针,即用指向结构变量(或数组)的结构指针作函数参数进行传送,这时由实参向形参传递的是地址
18、,属于“地址传递”方式,减少了时间和空间上的开销。,【例7.5】,返回1目录,【例7.5】(1),C语言程序设计(Visual C+6.0环境),返回(3),【例7.5】用结构指针变量作函数参数编程,计算一组学生的平均成绩并统计出不及格人数。程序名为l7_5.cpp。#include stdio.hstruct stu long int num;char name20;char sex;float score;student3=200001,Li li,W,99,200002,Wang hai,M,85,200003,Liuying,W,50;void average(struct stu*p
19、s)int n=0,i;float ave,s=0;,【例7.5】(2上接1),C语言程序设计(Visual C+6.0环境),返回(3),for(i=0;iscore;if(ps-score60)n+=1;printf(s=%fn,s);ave=s/3;printf(average=%fncount=%dn,ave,n);main()struct stu*s;s=student;average(s);运行情况如下:s=234.000000average=78.000000count=1.,程序演示,【例7.5】程序演示,返回例题,返回(3),2链表,C语言程序设计(Visual C+6.0环
20、境),返回7.1.4目录,(1)动态存储分配函数,(2)链表的使用,(1)动态存储分配函数,C语言程序设计(Visual C+6.0环境),返回2目录,分配内存空间函数malloc,分配内存空间函数calloc,释放内存空间函数free,【例7.6】,分配内存空间函数malloc,C语言程序设计(Visual C+6.0环境),返回(1)目录,分配内存空间函数malloc 调用形式:(类型说明符*)malloc(size)功能:在内存的动态存储区中分配一块长度为“size”字节的连续空间。函数的返回值为该空间的首地址;若此函数未能成功的执行,则返回的值为0。“类型说明符”表示把该区域用于何种数
21、据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如:pc=(char*)malloc(100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。,分配内存空间函数calloc,C语言程序设计(Visual C+6.0环境),返回(1)目录,分配内存空间函数calloc 调用形式:(类型说明符*)calloc(n,size)功能:在内存动态存储区中分配n块长度为“size”字节的连续空间。函数的返回值为该空间的首地址;若此函数未能成功的执行,则返回的值为0。(类型说明符*)用于强制类型
22、转换。calloc函数与malloc函数的区别仅在于一次可以分配一块还是n块区域。例如:语句ps=(struct stu*)calloc(2,sizeof(struct stu);中的函数sizeof(struct stu)是求struct stu结构体类型的长度。因此该语句的意思是:按照struct stu的长度分配2块连续区域,强制转换为struct stu类型,并把其首地址赋予指针变量ps。,释放内存空间函数free,C语言程序设计(Visual C+6.0环境),返回(1)目录,释放内存空间函数free 调用形式:free(void*ptr);功能:释放ptr所指向的内存空间,ptr指
23、向被释放区域的首地址,被释放区应是由malloc或calloc函数所分配的空间。ptr是一个无类型的指针变量。,【例7.6】(1),C语言程序设计(Visual C+6.0环境),返回本节目录,【例7.6】分配一块区域,输入一个学生数据。程序名为l7_6.cpp。#include stdio.h#include malloc.h#include string.hmain()struct stu int num;char name20;char sex;float score;*s;s=(struct stu*)malloc(sizeof(struct stu);,【例7.6】(2上接1),C语
24、言程序设计(Visual C+6.0环境),返回(1)目录,s-num=102;strcpy(s-name,Zhang ping);s-sex=M;s-score=62.5;printf(Number=%dnName=%sn,s-num,s-name);printf(Sex=%cnScore=%fn,s-sex,s-score);free(s);运行情况如下:Num=102Name=Zhang pingSex=MScore=62.500000,程序演示,【例7.6】程序演示,返回例题,返回(1)目录,(2)链表的使用,C语言程序设计(Visual C+6.0环境),返回2目录,链表是一种常见的
25、、重要的数据结构,它采用动态的分配办法为一个结构体分配内存空间。一方面需要时就分配一块空间用来存放,从而节约了宝贵的内存资源;且便于删除与加入。另一方面,在动态分配时,每个结点之间可以是不连续的(结点内是连续的),结点之间的联系是通过指针来实现的,即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放第三个结点的首地址,如此串连下去直到最后一个结点。最后一个结点因无后续结点连接,其指针域可赋为NULL。这样一种连接方式,如同一条一环接一环的链子,在数据结构中称之为“链表”。,(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 联合体 枚举 类型
链接地址:https://www.31ppt.com/p-6599072.html