C语言构造类型.ppt

上传人:牧羊曲112 文档编号:5426354 上传时间:2023-07-05 格式:PPT 页数:59 大小:703.50KB
返回 下载 相关 举报
C语言构造类型.ppt_第1页
第1页 / 共59页
C语言构造类型.ppt_第2页
第2页 / 共59页
C语言构造类型.ppt_第3页
第3页 / 共59页
C语言构造类型.ppt_第4页
第4页 / 共59页
C语言构造类型.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《C语言构造类型.ppt》由会员分享,可在线阅读,更多相关《C语言构造类型.ppt(59页珍藏版)》请在三一办公上搜索。

1、第八章 构造类型,第八章 构造类型,8.1 概述 8.2 结构体 8.3 定义结构体类型变量的方法 8.4 结构体变量的引用 8.5 结构体变量的初始化 8.6 结构体数组 8.7 指向结构体类型数据的指针,8.8 链表 8.9 共用体 8.10 枚举类型8.11 自定义类型标识符,8.1 概述,在前面学习了一些基本的数据类型(也叫简单类型),如整型、实型、字符型等,这些类型都是系统定义好的,程序员可以直接拿来使用。对于复杂的客观实体的定义,系统没有提供。例如一个学生的学号、姓名、性别、出生日期、学习成绩、家庭住址等属性的整体描述。,返回,C语言提供了自定义数据类型的方法,通过自定义类型将不同

2、类型的数据组合成一个有机的整体,这些数据在一个整体中是互相联系的。这种自定义的数据类型叫构造类型。实际上在前面已经学习了一种构造类型数组,数组是具有相同数据类型的一组元素集合。除了数组之外还有结构体、共用体。,8.1 概述,8.2 结构体,结构体类型就是将不同类型的数据组合成一个有机的整体,以便于引用。一个学生的属性:学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、家庭住址(addr),返回,C语言没有提供这种现成的数据类型,因此用户必须要在程序中建立所需的结构体类型。声明一个结构体类型的一般形式为:,8.2 结构体,以学生实体为例,建立一个结构体类型:,

3、8.2 结构体,struct student int num;char name20;char sex;int age;float score;char addr30;,声明了一个叫student的结构体类型,它包括num、name、sex、age、score、addr等不同类型的数据项。注意:(1)结构体类型名为:struct student,其中struct是定义结构体类型的关键字,用来定义变量的类型。(2)在 中定义的变量我们叫做成员,其定义方法和前面变量定义的方法一样,只是不能忽略最后的分号。,8.2 结构体,必须遵循先声明结构体类型,再定义结构体变量的原则。三种定义结构体变量的方法:

4、(1)先声明结构体类型再定义结构体变量名 格式如下:,8.3 定义结构体类型变量的方法,返回,8.3 定义结构体类型变量的方法,例如:,struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,说明:定义结构体变量时,结构体类型名中的struct不能省,不能变成:student stu1,stu2。(2)在声明类型的同时定义变量 格式如下:,8.3 定义结构体类型变量的方法,例如:,8.3 定义结构体类型变量的方法,struct student in

5、t num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,(3)直接定义结构类型变量 格式如下:,8.3 定义结构体类型变量的方法,其特点是在声明时不出现结构体名。例如:,struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,关于结构体类型说明:类型与变量是两个不同的概念,不能混淆。变量分配内存空间,类型不分配空间。对结构体中的成员可以单独使用,相当于普通变量,引用方法后面具体讲述。结构体中成员也可以是一个结构

6、体变量。,8.3 定义结构体类型变量的方法,struct date int month;int day;int year;struct student int num;char name20;char sex;int age;struct date birthday;/*birthday是struct date类型*/char addr30;stu1,stu2;,引用结构体变量要遵守如下规则:(1)不能将一个结构体变量作为一个整体进行输入输出(引用),而只能对结构体变量中的各个成员分别进行输入和输出(引用)。结构体变量成员引用格式:,8.4 结构体变量的引用,“.”是成员(又叫分量)运算符,它

7、的优先级最高。例如 stu1.num=10001;,返回,(2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低的成员进行赋值或存取以及运算。例如:stu1.birthday.year=1983;(3)对结构体变量成员可以像普通变量一样进行各种运算。例如:stu1.num+;stu1.age+=2;(4)可以引用结构体变量成员的地址。也可以引用结构体变量的地址。,8.4 结构体变量的引用,结构变量的初始化,8.5 结构体变量的初始化,struct student Int num;char name20;char sex;Int age;char

8、 addr30;stu1=10001,Liming,M,18,HubeiEnshi;,返回,定义结构体数组 在定义结构体数组之前必须先声明结构体类型。如前面定义的结构体类型struct student。声明好结构体类型之后就可以定义结构体数组了,其方法和定义简单类型的数组相似:,8.6 结构体数组,也可以直接定义结构体数组,返回,结构体数组的初始化,8.6 结构体数组,struct student int num;char name20;char sex;int age;float score;char addr30;stu2=10001,Liming,M,18,89.5,HubeiEnshi

9、,10002,ZhangJun,F,17,98,HubeiYichang;,可以不给出数组长度,数组长度由初始化的数据决定。stu=,;,8.6 结构体数组,指向结构体变量的指针 和定义简单变量的指针变量一样定义指向结构体变量的指针变量。,8.7 指向结构体类型数据的指针,用结构体指针变量引用结构体变量。,返回,例如:struct student stu1,*sp;sp=,8.7 指向结构体类型数据的指针,用结构体变量和指向结构体的指针作函数参数(1)用结构体成员变量做实际参数与简单变量作实参一样,属于“值传递”方式,只是要注意形参与实参在类型上要保持一致。,8.7 指向结构体类型数据的指针,

10、(2)用结构体变量做实际参数 注意:结构体变量的传递采用的是“值传递”的方式。形参与实参的类型必须相同。形参在函数调用期间也要占用内存单元,因此这种传递方式在空间与时间上开销较大。,8.7 指向结构体类型数据的指针,(3)指向结构体变量(或数组)的指针做实际参数用指向结构体变量(或数组)的指针做实参是经常采用的一种方法。形参指针和实参指针都指向同一存贮单元,这种特点为函数返回多个数据提供了途径。,8.7 指向结构体类型数据的指针,8.8 链表,链表概述 问题的提出:存放一个班级的学生信息,可以采用数组的方法,要存放30个学生就设计长度为30的数组,要存放50个学生就设计长度为50的数组。假如事

11、先并不知道学生人数,就必须将数组设计得足够大,例如,设计长度为100的数组,但实际学生数只有30,这样就会造成内存的浪费。显然用数组只适合于已知长度的数据,因为数组对内存的占用是静态的,程序运行过程中数组的长度是不变的。,返回,链表是一种常见的重要的数据结构。它可以动态的分配存储空间,需要多少就分配多少,是一种动态地进行存储分配的结构。一种简单链表如图所示:,8.8 链表,按规定在一个结构体的定义中,其成员类型可以是除本身结构类型之外的任何已有类型。也可以是任何已有类型(包括本身类型在内)的指针类型。结构体不能进行除指针类型数据成员的递归定义。这是因为无论什么类型的指针变量所占的空间是确定的,

12、都是4个字节。,8.8 链表,struct F float data;struct F*next;,链表有一个“头指针”变量,图中以head表示,它存放一个地址,该地址指向一个“结点”(在链表中将元素称为“结点”),每个结点包括两部分:一部分是用户需要用的实际数据(如A、B、C、D),另一部分为下一个结点的地址。,8.8 链表,head指向第一个结点,第一个结点指向第二个结点,直到最后一个结点,最后一个结点不再指向其他结点,称它为“表尾”,它的地址部分为“NULL”(表示“空地址”),链表到此结束。可以看到,这种链表的数据结构,必须利用指针特性才能实现。即一个结点中应包含一个指针变量,用它存放

13、下一结点的地址。,8.8 链表,声明结构体类型“结点”。struct student long num;float score;struct srudent*next;数据域中的数据采用给成员变量赋值的办法来赋值。指针域中的值是下一个结点的地址。,8.8 链表,静态链表 例 8.6 建立一个如上图所示的简单链表,它由3个学生数据的结点组成,输出结点中的数据。,8.8 链表,动态链表 C语言的库函数提供了开辟存贮空间的函数。(1)malloc 函数 原型为:,8.8 链表,该函数如果成功调用,可以在内存中开辟size指定大小的连续空间。返回值类型为void,请注意这不是表示没有返回值,而是表示返

14、回值可以指向任何类型。如果失败返回NULL。,该函数返回值是void类型,因此调用时需要强制转换成需要的类型。如:(int*)malloc(sizeof(int);(struct people*)malloc(sizeof(struct student);(2)free 函数 原型为:,8.8 链表,其作用是释放由p指向的内存区,即将这部分内存还给系统。要注意动态开辟的内存在不用之后应及时还给系统。free函数无返回值。实际上只有建立动态链表才是有意义的。例8.7 写一个函数建立一个有若干个学生数据的单向动态链表,并用num是否为0来判断输入是否结束。,8.8 链表,算法的N-S图如下:,8.

15、8 链表,建立动态链表的步骤如下:第一步:定义一个头指针head并指向NULL。,第二步:开辟新结点,并使p1,p2指向它,然后输入一个学生数据给新结点,并使指针域指向NULL。,8.8 链表,第三步:由于p1-num!=0,所以再开辟一个新结点,并使p1指向新结点,然后输入一个学生数据给新结点,并使指针域指向NULL。,第四步:由于p1-num!=0,所以再开辟一个新结点,并使p1指向新结点,然后输入一个学生数据给新结点,并使指针域指向NULL。,8.8 链表,第五步:由于p1-num!=0,所以再开辟一个新结点,并使p1指向新结点,然后输入一个学生数据给新结点,并使指针域指向NULL。,8

16、.8 链表,8.9 共用体,问题的提出:设计一个people结构体,用来存放学生或教师信息:,学生和教师信息中前五项都可以相同(类型),但后二项就不同了,如果是学生就要填写整型的班级号,如果是教师就要填写字符串型的职称了。,返回,怎么解决上述问题,能否做到是学生只分配班级号空间,是教师就分配职称空间,共用体可以做到这一点,以达到节省内存和更符合实际的目的。共用体的概述这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型。共用体也是属于构造类型,也要先声明类型再定义变量。,8.9 共用体,第一、这些不同的变量它们起始地址都相同;第二、每次只能存放其中一个变量。也就是使用覆盖技术,几个变量

17、互相覆盖。第三、共用体变量所占内存大小取几个不同类型变量所占内存中最大的那一个。,8.9 共用体,共用体类型的声明,8.9 共用体,例:union data int i;chat ch;float f;a,b,c;,共用体变量的引用方法 共用体变量的引用方法同结构体变量的引用方法一样,即不能整体引用共用体变量,只能引用共用体成员。格式:,8.9 共用体,共用体类型的特点(1)同一个内存段可以用来存放几种不同类型的成员,但在某一时刻只能存放其中一种。(2)内存中存放的数据是最后一次存入的内容,在此之前的内容全部被冲掉(覆盖),因此起作用的成员是最后一次存放的成员。(3)共用体变量的地址和它的各成

18、员的地址都是同一地址。,8.9 共用体,(4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,也不能初始化共用体变量。(5)不能用共用体变量作为函数参数(共用体成员可以),也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体变量这种用法相仿)。(6)共用体和结构体可以互相嵌套定义。,8.9 共用体,例8.12:设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、学号、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务或职称,现在要将它们放在同一的表格中。如果“job”项为“s”则第6顶为class,如果“job”项为“t”,则第6项为offic

19、e。显然对第6项要处理成共用体的形式将class和office放在同一段内存中,如图所示。,8.9 共用体,8.10 枚举类型,所谓“枚举”是指变量可能的取值的个数较少,可以一一列举出来,变量的值只限于列举出来的值的范围内。这种情况很多,如一周七天,一年十二个月,七种基本颜色,逻辑类型的“真”和“假”。,返回,枚举类型的声明与枚举变量的定义枚举也需要先声明类型再定义变量。实际上枚举类型并不是构造类型,它是一种与整型兼容的数据类型。枚举类型的声明格式:,8.10 枚举类型,例如:定义一周七天的枚举类型。enum WEEKDAY Sun,Mon,Tue,Wed,Thu,Fri,Sat;定义枚举类型

20、的变量和前面定义结构体和共用体的变量相似,有三种方法。(1)先声明枚举类型再定义枚举变量 例如:enum WEEKDAY today,tomorrow;(2)定义枚举类型的同时定义枚举变量 例如:enum WEEKDAY Sun,Mon,Tue,Wed,Thu,Fri,Sat today,tomorrow;,8.10 枚举类型,(3)定义无名枚举类型 例如:enum Sun,Mon,Tue,Wed,Thu,Fri,Sat today,tomorrow;说明:枚举类型中的取值列表称为枚举元素或枚举常量,它们是用户定义的标识符,一般为了与变量区别可以用大写字母。,8.10 枚举类型,同时定义的枚举

21、常量不会自动地代表什么含义,例如定义Sun不会自动代表“星期天”,用什么标识符代表什么含义完全由程序员自己决定,并在程序中作相应的处理。枚举类型与整型的关系和说明 枚举类型中的“取值列表”与整数有一一对应关系,枚举中的每个符号依次与0,1,2,3,对应,如前面的定义中:Sun0 Mon1 Tue2 Wed3 Thu4 Fri5 Sat6。,8.10 枚举类型,也就是说枚举类型中定义的“符号”实际上是整数。也可以任意改变其对应关系:例如:enum WEEKDAY Sun=0,Mon,Tue=5,Wed,Thu,Fri,Sat;此时 Sun0 Mon1 Tue5 Wed6 Thu7 Fri8 Sa

22、t9 枚举值是可以进行算术运算的,Sun+2是允许的。但是Sun=2操作是非法的,因为Sun是常量不能用赋值符来改变其值。,8.10 枚举类型,几点说明:枚举元素是常量不是变量。C语言和输出函数printf()不识别枚举符号,因此不能用输出函数得到枚举符号,枚举值可以进行判断比较,比较时按枚举值的顺序号进行。一个整数不能直接赋给一个枚举变量。,8.10 枚举类型,8.11 自定义类型标识符,用typedef声明的类型名来代替已有的类型名,也就是用户可以用一个自定义的标识符来代表一个特定的数据类型。自定义类型标识符定义格式:,例如:typedef int DISTANCE;typedef flo

23、at REAL;此后可以用DISTANCE和REAL来定义变量,并且DISTANCE代表整型,REAL代表单精度型。,返回,自定义类型标识符三个作用:(1)提高程序的可读性。(2)提高程序的可维护性。(3)避免类型使用上的不一致性。特别是对于复杂的类型,用一个简单的标识符来代表可以大大简化对象的说明,避免不必要的“笔误”。,8.11 自定义类型标识符,在定义一个结构体时要先声明类型再定义变量。struct student/定义结构体类型 char No5;char Name10;int age;struct student stu1,stu2;/定义结构体变量,8.11 自定义类型标识符,如果用自定义类型标识符方式 typedef struct/定义结构体类型 char No5;char Name10;int age;stuType;stuType stu1,stu2;/定义结构体变量 用stuType代替了struct student这个结构体类型。,8.11 自定义类型标识符,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号