第08章结构体、共用体与枚举类型精.ppt
《第08章结构体、共用体与枚举类型精.ppt》由会员分享,可在线阅读,更多相关《第08章结构体、共用体与枚举类型精.ppt(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第08章结构体、共用体与枚举类型第1页,本讲稿共79页第第8章章 结构体、共用体与枚举类型结构体、共用体与枚举类型 8.1 8.1 概述概述8.2 8.2 结构体定义结构体定义8.3 8.3 结构体变量的使用结构体变量的使用8.4 8.4 结构体数组结构体数组8.5 8.5 结构体与指针结构体与指针*8.6 8.6 结构体与函数结构体与函数*8.7 8.7 共用体共用体*8.8 8.8 枚举类型枚举类型8.9 8.9 用户定义类型用户定义类型本章小结本章小结第2页,本讲稿共79页8.1 8.1 概述概述 在学习本章之前,我们已经讨论过的数据类型有简单类型(整型、实型、字符型)、数组类型和指针类
2、型。简单变量是一个单个的变量,变量与变量之间无固定内在的联系,分别表示独立的数据,无从属关系。数组则表示是同一类型数据的集合,并用下标把数组的各个元素有序地联系起来。指针类型主要是用于动态存储分配,它们适合于各自不同的用途。但这些数据类型有时还难以处理一些较为复杂的数据结构,例如:在数据处理领域中,常常要求把一些不同类型的数据作为一个整体来处理。上面提到的在中国计算机软件专业技术资格和水平考试 中,用来描述每一个考生的信息,由准考证号(长整型)、姓名(字符型数组)、性别(字符型)、年龄(整型)、报考级别(第3页,本讲稿共79页 字符数组)和成绩(实型)组成。它们的处理对象均为参加软考的应试人员
3、,但又都分别属于不同的类型。这时如果使用简单的变量来表述,则难以反映出它们之间的内在联系,用数组则无法容纳不同类型的元素。因此,如同其它高级语言(如PASCAL,COBOL等)一样,C语言提供了一种称之为结构体的类型(Structure),来描述这种由不同类型数据组成的“复杂类型”。如图8-l所示。准考证号姓名性别年龄报考级别成绩(长整型)(字符数组)(字符)(整型)(字符数组)(实型)图8-1结构体类型数据项的描述第4页,本讲稿共79页上图表示的结构体,可用下列程序语句来描述,稍后我们会进行详细的解释。struct examineeslong num;char name20;char sex
4、;int age;char grade2;float score;第5页,本讲稿共79页8.2 8.2 结构体定义结构体定义 上面我们用C语言定义了一个如图8-1所示的由不同类型的数据项所组成的复合类型,这种类型就称之为结构体类型。组成结构体的每个数据称为该结构体的成员项,有时又称为结构体分量。在程序中若要使用结构体时,就必须首先对结构体的组成进行描述,这称为结构体的定义。结构体的定义应说明该结构体是由哪几个成员项组成的,以及每个成员项具有的数据类型。8.2.1 8.2.1 结构体类型的定义结构体类型的定义 第6页,本讲稿共79页定义一个结构体类型的一般形式为:struct结构体类型名 数据类
5、型 成员名1;数据类型 成员名2;数据类型 成员n;第7页,本讲稿共79页结构体类型和基本数据类型的主要区别如下:(1)结构体类型定义中的每一个成员项,表示该结构体的分量或称“域”,它们并不是变量。例如,上面定义的num,name,sex,age等均为结构体类型struct examinees的成员,而不能称为变量名。因此,在一个函数中,允许另外定义与结构体类型成员相同名的变量,它们各自代表不同的对象。例如:struct examinees int age;char grade2;float score;/*定义age、grade、score为结构体类型成员*/int age;char gra
6、de2;float score;/*定义age、grade、score为变量*/第8页,本讲稿共79页(2)基本数据类型(如int,char,float等)是一个具体的数据类型,一旦定义后其说明的变量就分配了固定字节的内存空间,按指定的形式存放。例如,一个整型变量占2个字节并按定点形式存放。而“结构体类型”只是一个抽象的数据类型,它只表示了“由若干不同类型数据项组成的复合类型”,它由哪些成员项组成,占多少字节等信息。(3)与基本数据类型不同,系统没有预先定义结构体类型,凡需使用结构体类型数据的,都必须在程序中先行加以定义。定义了一个结构体类型后,系统并没有为所定义的各成员项分配相应的存储空间,
7、这是因为定义类型而不是定义变量。定义一个类型只是说明该类型的结构,即告诉系统它由哪些类型的成员构成,各占多少字节、按什么形式存储,并把它们当成一个整体来处理。应当明确,只有在定义了变量以后,系统才为所定义的变量分配相应的存储空间。第9页,本讲稿共79页8.2.2 8.2.2 结构体变量定义结构体变量定义 结构体作为一种数据构造类型在C 语言程序中必须经过“定义初始化引用”的过程。下面我们分别来进行讨论。我们首先来讨论结构体类型变量的定义。定义一个结构体变量,可以采用以下三种不同的方法:1.先进行结构体类型的定义,然后再进行结构体变量的定义 例如,上面已定义了一个结构体类型struct exam
8、inees后,现在就可以用它来定义相应类型的变量了。例如:struct examinees stud1,stud2;第10页,本讲稿共79页 其中struct examinees称为结构体类型名,stud1,stud2称为结构体变量名。也称变量stud1,stud2具有struct examinees类型的结构。如图8-2所示:应当说明:(1)一旦进行了上述结构体变量的定义后,变量stud1和stud2就与C语言中的其它变量一样,系统将根据组成该变量各成员的不同类型,分配相应的存储空间。(2)结构体变量名末尾必须带有一个分号,用以表示变量表结束。stud120101“Li Ping”M18“2
9、C”86.5stud220102“Liu Hao”F20“2P”90图8-2 定义结构体类型变量:stud1 和stud2第11页,本讲稿共79页(3)定义一个结构体类型变量与定义一个标准类型变量不同。例如,在定义一个整型变量时,只需指出int变量名即可。但在定义结构体类型变量时不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型。因此将上述考生结构体类型变量定义成:examinees stud1,stud2 或者:struct stud1,stud2;都将是错误的。(4)定义了一个结构体类型后,就可以多次用来定义各种具体的结构体类型变量。(5)为了使用方便,通常在程序开头,定义一
10、个符号常量来代表一个结构体类型:#define STUD struct examinees 这样在程序中,STUD就与struct examinees完全等效。第12页,本讲稿共79页STUD long num;char name20;int age;char grade2;float score;这样定义类型后,就可以直接用STUD来定义变量了;STUD stud1,stud2;于是用该方法定义结构体变量就和用int,char,float定义基本变量的形式一样,不必再写struct关键字。第13页,本讲稿共79页2.在定义结构体类型的同时定义结构体变量用该方式定义的一般形式是:struct
11、结构体类型名 数据类型 成员名1;数据类型 成员名2;数据类型 成员名n;结构体变量名表;例如:上述软件考试的考生结构体类型变量又可以用该方法定义如下:第14页,本讲稿共79页struct examinees long num;char name 20;char sex;int age;char grade2;float score;stud1,stud2;这种定义方式较为紧凑,既定义了类型,又定义了变量。如果还需定义其它同类型的结构体变量,还可用:struct examinees stud3,stud4;这样表示又定义了两个和变量stud1,stud2同类型的结构体变量stud3,stud4
12、。第15页,本讲稿共79页3.直接定义结构体类型变量其一般形式为:struct数据类型 成员名1;数据类型 成员名2;数据类型 成员名n;结构体变量名表;第16页,本讲稿共79页例如上述定义又可写成:struct long num;char name20;char sex;int age;char grade2;float score;stud1,stud2;这种定义方法与上面第二个定义方法相比较,只是省略了结构体类型名examinees。因此就不能再用它来定义其它变量。下面的定义则为非法的:struct stud3,stud4;第17页,本讲稿共79页上述三种结构体变量的定义方法,可根据实际
13、处理情况选择使用。但应当注意以下几点:(1)类型和变量是不同的概念,不能混同。在定义一个结构体变量时,应先定义其类型,然后再定义变量为该类型。只有经过变量定义后,才能对变量进行赋值、存取或运算操作处理;而不能对一个类型进行相应的操作运算,并且系统只能为变量分配存储空间。(2)对结构体类型中的成员项(或称“域”,“结构分量”)可以单独引用,其作用相当于基本变量。有关引用方法将在后面讨论。(3)允许结构体类型中的成员项是结构体变量,例如上述考生结构体类型变量中,当我们将年龄项改为出生日期时,其结构形式如图8-3 所示:第18页,本讲稿共79页 这样,我们就需先定义一个struct date类型,它
14、表示出生日期,应包括三个成员项month(月)、day(日)、year(年)。然后在struct examinees结构体中,将成员项birthday定义成:struct date结构体类型。例如:第19页,本讲稿共79页struct date int month;int day;int year;struct examinees long num;char name20;struct date birthday;char grade2;float score;stud1,stud2;第20页,本讲稿共79页8.3 8.3 结构体变量的使用结构体变量的使用 在结构体类型变量说明的同时,可以给它
15、的每个成员项赋初值,这称之为结构体类型变量的初始化。对结构体变量的初始化规则与数组相同,即只有当结构体变量为全局变量或为静态变量时,才能进行初始化。8.3.1 8.3.1 结构体变量初始化结构体变量初始化 第21页,本讲稿共79页1.对外部存储类型的结构体变量进行初始化例如:struct examinees struct examinees stud1=20101,“Li Ping”,“M”,18,“2C”,86.5;main()上面结构体变量studl 为外部全局变量,在初始化时,按照所定义的结构体类型的数据结构,依次写出各初始值,在编译时,就将它们赋给变量中各成员。第22页,本讲稿共79页
16、2.对静态存储类型的结构体变量进行初始化例如:main()static struct examinees long num;char name20;char sex;int age;char grade2;float score;stud1=20101,“Li Ping”,M,18,“2C”,86.5 第23页,本讲稿共79页 应当指出对结构体变量进行初始化时要注意以下两点:(1)初始化是指对结构体变量斌与初值,而不是对结构体类型中的各成员项赋值,因此,下述初始化形式是错误的:static struct examinees long num=20101;char name20=“Li Ping
17、”;char sex=M int age=18;char grade2=“2C”;float score=86.5;stud1;第24页,本讲稿共79页(2)如果一个结构体类型内又嵌套另一个结构体类型(如图8-3所示的形式),则对该结构体变量初始化时,仍按顺序写出各个初始值:static struct examinees stud1=20101,”Li Ping”,M,10,12,1978,”2C”,86.5 其中10,12,1978为birthday的初值。第25页,本讲稿共79页8.3.2 8.3.2 结构体变量引用结构体变量引用 结构体是由不同数据类型的若干数据集合而成。在程序中使用结构
18、体时,一般不允许把结构体作为一个整体参加操作处理,而应通过对结构体的各个成员项的引用来实现各种运算和操作。1.引用结构体变量中的一个成员 由于结构体变量是一个整体,要访问其中一个成员,必须先找到这个结构体变量,然后再从中找出其中的一个成员。引用的一般形式:结构体变量名.成员名 其中圆点符号称为成员运算符。例如上面定义的结构中要想访问stud1项,应写成:stud1.age。第26页,本讲稿共79页访问stud1.age的步骤如图8-4 所示:即第一步先访问结构体变量stud1,找到该变量的起始地址后,第二步从stud1所分配的内存区间中找到age 成员项对应的数据。说明:(1)如果在同一函数中
19、又另外定义了一个age简单变量,它将由系统另外分配存储空间,与stud1.age分属不同的变量。stud1.age表示结构体变量中的age 成员项,而age 表示简单变量age。第27页,本讲稿共79页(2)若定义stud1,stud2 均为同一结构体类型struct examinees的两个变量,则当引用两个变量中的age 成员项时,应分别用stud1.age和stud2.age,它们表示内存中不同的存储单元并且各自有不同的值。(3)如果一个结构体中又嵌套一个结构体,则要访问一个成员时,应采取逐级访问的方法。例如:图8-3中所示的嵌套结构体变量,若要访问考生l 的出生年份时,则用:stud1
20、.birthday.year。而不能写成:year 或birthday.year或stud1.year。(4)允许对结构体变量的成员进行各种相应的运算,但运算的规则应遵循定义结构体时各成员项类型的规则。例如:stud1.num的类型是长整型,因此,它适合于长整型简单变量所允许的所有运算。如算术运算、关系运算、逻辑运算和赋值运算等。第28页,本讲稿共79页例如:stud1.num=20101 (赋值运算)stud2.num=stud1.num+1 (算术运算)stud1.age+(自加运算)stud2.score=60.0 (关系运算)addr=&stud2.num (取地址运算)2.结构体类型
21、变量的整体引用 可以将一个结构体变量作为一个整体赋给另一个同类型的结构体变量。例如:stud2=stud1;执行stud2=stud1这个赋值语句时,完成将stud1变量中各成员项逐个依次赋给stud2中相应的各成员。当然要求stud1和stud2必须具有完全相同的数据类型。但必须注意,不允许将一组常量直接赋给一个结构体变量。如下面赋值语句是非法的:stud2=20102,“Liu Hao”,F,20,2P,90 第29页,本讲稿共79页3.结构体变量的输入和输出 结构体变量的输入输出,同样要求必须指明结构体变量所对应的各成员项。例如:scanf(%ld,%s,%c,%d,&stud2.num
22、,stud2.name,stud2.sex,&stud2.age);表示输入stud2变量的各成员项的值;printf(%ld,%s,%c,%dn,stud1.num,stud1.name,studl.sex,studl.age);表示输出studl变量的各成员项的值。应当注意:C语言不允许把一个结构体变量作为一个整体进行输入输出操作。因此下面的输入输出语句均是错误的。scanf(%ld,&studl);printf(%ldn,studl);或者scanf(%ld,%s,%c,%d,&studl);printf(%ld,%s,%c,%dn,studl);第30页,本讲稿共79页8.4 8.4
23、结构体数组结构体数组 根据C语言规定,凡具有相同数据类型的数据均可以组成数组。例如前面讨论过的整型数组、实型数组、字符型数组以及布尔型数组等。根据同样的原则,具有相同结构类型的结构体也可以组成数组,称之为结构体数组,即结构体数组中的每一个元素都是结构体变量。8.4.1 8.4.1 结构体数组定义与初始化结构体数组定义与初始化 第31页,本讲稿共79页1.结构体数组的定义 定义结构体数组的方法和定义结构体变量的方法相类似,只是需进行数组定义说明。定义方法可以采用以下三种方法:(1)先进行结构体类型的定义,然后再定义结构体数组例如:struct examineeslong num;char nam
24、e20;char sex;int age;char grade 2;float score;struct examinees stud 30;第32页,本讲稿共79页 上面定义了一个结构体数组stud,它由30个元素组成,每个元素都是struct examinees类型。该数组在内存中占有一段连续的存储空间,相当于定义了一张软件考试的考生信息表。如图8-5 所示:(2)同时进行结构体类型和结构体数组的定义 例如:struct examinees long num;float score;stud30;第33页,本讲稿共79页(3)直接定义结构体数组而不需定义结构体类型名例如:struct lo
25、ng num;float score;stud30;以上三种定义方法的效果均相同,定义后该数组的每个元素占33个字节,30 个元素共占990个字节空间。它们在内存中的存储示意图如图8-6所示:第34页,本讲稿共79页2.结构体数组的初始化 结构体数组在引用前可以进行初始化,即对结构体变量中的各个元素赋初始值。但C语言规定只能对全局的或静态存储类型的结构体数组初始化。例如:struct examinees long num;char name20;char sex;int age;char grade2;float score;stud3=20101,“Li Ping”,M,18,“2C”,86
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 08 结构 共用 枚举 类型
限制150内