第08章结构体、共用体与枚举类型课件

上传人:我*** 文档编号:141161821 上传时间:2020-08-04 格式:PPT 页数:84 大小:460KB
返回 下载 相关 举报
第08章结构体、共用体与枚举类型课件_第1页
第1页 / 共84页
第08章结构体、共用体与枚举类型课件_第2页
第2页 / 共84页
第08章结构体、共用体与枚举类型课件_第3页
第3页 / 共84页
第08章结构体、共用体与枚举类型课件_第4页
第4页 / 共84页
第08章结构体、共用体与枚举类型课件_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《第08章结构体、共用体与枚举类型课件》由会员分享,可在线阅读,更多相关《第08章结构体、共用体与枚举类型课件(84页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计,湖南工学院,第8章 结构体、共用体与枚举类型,8.1 概述 8.2 结构体定义 8.3 结构体变量的使用 8.4 结构体数组 8.5 结构体与指针 *8.6 结构体与函数 *8.7 共用体 *8.8 枚举类型 8.9 用户定义类型 本章小结,8.1 概述,在学习本章之前,我们已经讨论过的数据类型有简单类型(整型、实型、字符型)、数组类型和指针类型。简单变量是一个单个的变量,变量与变量之间无固定内在的联系,分别表示独立的数据,无从属关系。数组则表示是同一类型数据的集合,并用下标把数组的各个元素有序地联系起来。指针类型主要是用于动态存储分配,它们适合于各自不同的用途。但这些数据类型

2、有时还难以处理一些较为复杂的数据结构,例如:在数据处理领域中,常常要求把一些不同类型的数据作为一个整体来处理。上面提到的在中国计算机软件专业技术资格和水平考试 中,用来描述每一个考生的信息,由准考证号(长整型)、姓名(字符型数组)、性别(字符型)、年龄(整型)、报考级别(,字符数组)和成绩(实型)组成。它们的处理对象均为参加软考的应试人员,但又都分别属于不同的类型。这时如果使用简单的变量来表述,则难以反映出它们之间的内在联系,用数组则无法容纳不同类型的元素。因此,如同其它高级语言(如PASCAL,COBOL等)一样,C语言提供了一种称之为结构体的类型(Structure),来描述这种由不同类型

3、数据组成的“复杂类型”。如图8-l所示。,上图表示的结构体,可用下列程序语句来描述,稍后我们会进行详细的解释。 struct examinees long num; char name20; char sex; int age; char grade2; float score; ,8.2 结构体定义,8.2.1 结构体类型的定义,定义一个结构体类型的一般形式为: Struct 结构体类型名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员n; ;,结构体类型和基本数据类型的主要区别如下: (1)结构体类型定义中的每一个成员项,表示该结构体的分量或称“域”,它们并不是变量。例如,上面

4、定义的num, name, sex, age等均为结构体类型struct examinees的成员,而不能称为变量名。因此,在一个函数中,允许另外定义与结构体类型成员相同名的变量,它们各自代表不同的对象。例如: struct examinees int age; char grade2; float score; /* 定义age、grade、 score为结构体类型成员 */ ; int age; char grade2; float score; /* 定义age、grade、score为变量 */,(2) 基本数据类型(如int,char,float等)是一个具体的数据类型,一旦定义后其

5、说明的变量就分配了固定字节的内存空间,按指定的形式存放。例如,一个整型变量占2个字节并按定点形式存放。而“结构体类型”只是一个抽象的数据类型,它只表示了“由若干不同类型数据项组成的复合类型”,它由哪些成员项组成,占多少字节等信息。 (3) 与基本数据类型不同,系统没有预先定义结构体类型,凡需使用结构体类型数据的,都必须在程序中先行加以定义。定义了一个结构体类型后,系统并没有为所定义的各成员项分配相应的存储空间,这是因为定义类型而不是定义变量。定义一个类型只是说明该类型的结构,即告诉系统它由哪些类型的成员构成,各占多少字节、按什么形式存储,并把它们当成一个整体来处理。应当明确,只有在定义了变量以

6、后,系统才为所定义的变量分配相应的存储空间。,例:定义一个反映学生基本情况的结构类型,用以存储学生的相关信息,Struct date int year; int month; int day; ,Struct date int year,month,day; ;,Struct student_info char no7; char name9; char sex3; stru date birthday; ,8.2.2 结构体变量定义,定义一个结构体变量,可以采用以下三种不同的方法: 1.先进行结构体类型的定义,然后再进行结构体变量的定义 例如,上面已定义了一个结构体类型struct exam

7、inees后,现在就可以用它来定义相应类型的变量了。例如: struct examinees stud1, stud2;,其中struct examinees称为结构体类型名,stud1,stud2称为结构体变量名。也称变量stud1,stud2具有struct examinees类型的结构。如图8-2所示: 应当说明: (1) 一旦进行了上述结构体变量的定义后,变量stud1和stud2就与C语言中的其它变量一样,系统将根据组成该变量各成员的不同类型,分配相应的存储空间。 (2) 结构体变量名末尾必须带有一个分号,用以表示变量表结束。,(3) 定义一个结构体类型变量与定义一个标准类型变量不同

8、。例如,在定义一个整型变量时,只需指出int变量名即可。但在定义结构体类型变量时不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型。 因此将上述考生结构体类型变量定义成: examinees stud1, stud2 或者:struct stud1, stud2;都将是错误的。 (4) 定义了一个结构体类型后,就可以多次用来定义各种具体的结构体类型变量。 (5) 为了使用方便,通常在程序开头,定义一个符号常量来代表一个结构体类型: # define STUD struct examinees 这样在程序中,STUD就与struct examinees完全等效。,STUD long

9、 num; char name20; int age; char grade2; float score; 这样定义类型后,就可以直接用STUD来定义变量了; STUD stud1, stud2; 于是用该方法定义结构体变量就和用int,char,float定义基本变量的形式一样,不必再写struct关键字。,2.在定义结构体类型的同时定义结构体变量 用该方式定义的一般形式是: struct 结构体类型名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; 结构体变量名表; 例如:上述软件考试的考生结构体类型变量又可以用该方法定义如下:,struct examinees long

10、 num; char name 20; char sex; int age; char grade2; float score; stud1, stud2; 这种定义方式较为紧凑,既定义了类型,又定义了变量。如果还需定义其它同类型的结构体变量,还可用: struct examinees stud3, stud4; 这样表示又定义了两个和变量stud1, stud2同类型的结构体变量stud3,stud4。,3.直接定义结构体类型变量 其一般形式为: struct 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; 结构体变量名表;,例如上述定义又可写成: struct long

11、num; char name20; char sex; int age; char grade2; float score; stud1, stud2; 这种定义方法与上面第二个定义方法相比较,只是省略了结构体类型名examinees。因此就不能再用它来定义其它变量。下面的定义则为非法的: struct stud3, stud4;,说明: 1)结构体变量拥有该结构体类型的全部成员 2)结构体变量所占内存空间为各成员所占内存空间之和,各成员按结构体类型定义的顺序分配内存单元,上述三种结构体变量的定义方法,可根据实际处理情况选择使用。但应当注意以下几点: (1) 类型和变量是不同的概念,不能混同。

12、在定义一个结构体变量时,应先定义其类型,然后再定义变量为该类型。只有经过变量定义后,才能对变量进行赋值、存取或运算操作处理;而不能对一个类型进行相应的操作运算,并且系统只能为变量分配存储空间。 (2) 对结构体类型中的成员项(或称“域”,“结构分量”)可以单独引用,其作用相当于基本变量。有关引用方法将在后面讨论。 (3)允许结构体类型中的成员项是结构体变量,例如上述考生结构体类型变量中,当我们将年龄项改为出生日期时,其结构形式如图8-3 所示:,这样,我们就需先定义一个struct date类型,它表示出生日期,应包括三个成员项month(月)、day(日)、year(年)。然后在struct

13、 examinees结构体中,将成员项birthday定义成:struct date结构体类型。 例如:,struct date int month; int day; int year; struct examinees long num; char name20; struct date birthday; char grade2; float score; stud1,stud2;,8.3 结构体变量的使用,在结构体类型变量说明的同时,可以给它的每个成员项赋初值,这称之为结构体类型变量的初始化。对结构体变量的初始化规则与数组相同,即只有当结构体变量为全局变量或为静态变量时,才能进行初始化

14、。,8.3.1 结构体变量初始化,1.对外部存储类型的结构体变量进行初始化 例如: struct examinees struct examinees stud1=20101,“Li Ping”,“M”, 18,“2C”, 86.5; main() 上面结构体变量studl 为外部全局变量,在初始化时,按照所定义的结构体类型的数据结构,依次写出各初始值,在编译时,就将它们赋给变量中各成员。,2.对静态存储类型的结构体变量进行初始化 例如: main() static struct examinees long num; char name20; char sex; int age; char

15、grade2; float score; stud1=20101,“Li Ping”,M, 18, “2C”, 86.5 ,应当指出对结构体变量进行初始化时要注意以下两点: (1) 初始化是指对结构体变量斌与初值,而不是对结构体类型中的各成员项赋值,因此,下述初始化形式是错误的: static struct examinees long num=20101; char name20=“Li Ping”; char sex=M int age=18; char grade2=“2C”; float score=86.5; stud1;,(2) 如果一个结构体类型内又嵌套另一个结构体类型(如图8-

16、3所示的形式),则对该结构体变量初始化时,仍按顺序写出各个初始值: static struct examinees stud1=20101,”Li Ping”,M,10, 12, 1978,”2C”, 86.5 其中10,12,1978为birthday的初值。,8.3.2 结构体变量引用,结构体是由不同数据类型的若干数据集合而成。在程序中使用结构体时,一般不允许把结构体作为一个整体参加操作处理,而应通过对结构体的各个成员项的引用来实现各种运算和操作。 1.引用结构体变量中的一个成员 由于结构体变量是一个整体,要访问其中一个成员,必须先找到这个结构体变量,然后再从中找出其中的一个成员。引用的一般形式: 结构体变量名.成员名 其中圆点符号称为成员运算符。例如上面定义的结构中要想访问stud1项,应写成:stud1.age。,2如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低的成员进行赋值或存取以及

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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