资源描述
单击此处编辑母版标题样式,2019/11/17,Visual C+程序设计,#,2024/11/22,Visual C+程序设计,1,第 章 结构体、共同体和枚举类型,2024/11/22,Visual C+程序设计,2,结构体,2024/11/22,Visual C+程序设计,3,数组中的每一个元素属于同一种数据类型,利用数组处理大量的,同类型,数据是很方便的。但是在实际应用中,常常需要把不同类型而关系又非常密切的数据组织在一起,形成一个整体,以便于统一管理。,一种称为结构体的数据类型,可以用来描述这种类型的数据集。,结构,是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中,可以使用不同的数据类型,。结构通常用来定义存储在文件中的记录。,2024/11/22,Visual C+程序设计,4,一:结构的定义 结构是一种派生类,数据类型,,在使用结构变量之前须先对结构进行定义。定义结构的一般格式为,:,struct,结构名,类型,变量名;,类型,变量名;,.,;,结构名是结构的标识符不是变量名,花括号内的变量称之为结构的成员,类型可以是我们以前所学到的任意类型,甚至可以是结构但不能是结构本身,每个成员的类型可以不一样。注意:每一个结构定义必须以,分号,结束!,2024/11/22,Visual C+程序设计,5,由于定义结构类型只是定义了一种数据类型,因此,当编译器编译结构体的定义时,并不为结构体中的成员分配任何内存空间,从而在定义结构体的成员时,不能指定成员的存储类型为,auto,、,register,、,extern,,但可以指定结构体成员的存储类型为,static,,其特点和作用将在以后介绍。,2024/11/22,Visual C+程序设计,6,二:结构变量的定义 声明结构变量与声明其它类型变量类似,格式为:,struct,结构名 结构变量名;如:,struct student int No;char name8;,float score;,;,student stu1,stu2,stu30,;,也可在定义结构的同时定义结构变量,如:,struct student int No;char name8;,float score;stu1,stu2,stu30,;,2024/11/22,Visual C+程序设计,7,与基本数据类型类似,在定义结构体类型的变量时,也可对该变量进行初始化,其方法与对数组的初始化方法类似,即采用用花括号括起来的初始值表。,注意,初始值表中的数据类型必须与结构体中对应元素的类型一致,(,兼容的除外,),,否则会产生编译错误。另外,初始值表中的数据的个数不能大于结构体中元素的个数。,在定义结构体类型的变量时,也可以指定变量的存储类型。,2024/11/22,Visual C+程序设计,8,三:结构变量的初始化,struct student int No;char name8;,float score;,;,student stu1=9601,”,张三,“,96.5,;,student stu2=9601,”,张三,“,96.5,9602,”,李四,“,80;,或者,struct student int No;char name8;,float score;stu2=9601,”,张三,“,96.5,9602,”,李四,“,80,;,2024/11/22,Visual C+程序设计,9,对于结构体类型的变量,在编译过程中,编译系统将为这些变量分配相应的内存空间,所分配的空间大小,原则上,为结构体中所有成员所占空间的总和。,结构体变量也存在作用域的问题,其作用域与一般变量的作用域相同。,2024/11/22,Visual C+程序设计,10,结构体类型变量的使用,对结构体变量的使用一般是通过对其成员的引用实现的。使用结构体变量的成员的一般格式为:,.,其中,,“,“,是结构体成员运算符,2024/11/22,Visual C+程序设计,11,struct student int No;char name8;,float score;,;,四:结构成员的访问,student stu1,;,cinstu1,No,;,coutstu1,name,;,stu1,score=89.5,;,2024/11/22,Visual C+程序设计,12,结构体类型变量本身也可参与一些运算,:,1),同类型的结构体变量可以相互赋值。,2),结构体类型变量不能直接进行输入输出。,3),结构体类型变量可以作为函数的参数,函数的返回值也可以是结构体类型。当函数的形参与实参为结构体类型的变量时,其结合方式属于,值传递,方式。,【,例,7.2】,2024/11/22,Visual C+程序设计,13,结构体数组,定义结构体数组的方法与定义结构体类型变量的方法类同,只是在定义时增加维数的说明,也有三种方法。,在说明结构体数组时,可对它进行初始化,其方法与数组类似,有两种方法:第一种方法是将数组的每一个元素的成员的值用花括号括起来,再将数组的全部元素值用一对花括号括起来;第二种方法是在花括号内依次列出各个元素的成员值。,【,例,7.3】,2024/11/22,Visual C+程序设计,14,结构体类型的静态成员,在定义结构体类型时,可以把某一个成员的存储类型声明为静态的,这样,在这种结构体类型的所有变量中,编译系统只为该静态成员分配一个存储空间,即这种结构体类型的所有变量的静态成员的值都相同,只要改变了其中一个变量的静态成员的值,其它变量的该成员的值也随之改变。,【,例,7.5】,2024/11/22,Visual C+程序设计,15,编译系统一开始就为结构体的静态类型成员分配内存空间,并进行初始化。但在结构体中说明的静态成员属于引用性说明,在这里并不会为其分配内存空间,因此必须在文件作用域的某一个地方进行,定义性说明,,而且仅能说明一次。定义性说明的一般格式为:,:,;,其中,与该静态成员的类型一致,符号,“,:,”,称为,作用域运算符,,它表示成员与结构的一种隶属关系。,静态成员可以脱离具体结构体变量而存取,即可以利用结构体名和作用域运算符表示该成员。,在用初始值表对结构体变量初始化时,不再对静态成员置初值,即初始值表将跳过静态成员。,2024/11/22,Visual C+程序设计,16,*,位域,如将一个字或一个字节以二进位为单位划分为若干个区域,则每一个区域称为一个,位域,。位域通常用于表示较小范围内的数。,定义位域的一般格式为:,struct unsigned:;unsigned:;,;,位域名可以省略。位域名后的,,可为,0,或正整数,表示相应的位域所占用的二进位数。,2024/11/22,Visual C+程序设计,17,位域类型变量的使用方法与结构体类型变量的使用方法完全相同。,(1),在一个结构体中定义的任一个位域都必须在同一个存储单元中,(4,个字节共,32,位,),。如果本存储单元中剩余的二进位不够定义一个位域成员时,则该存储单元的剩余的二进位不用,而从下一个存储单元开始。,(2),可以定义一个无名的位域成员,表示跳过若干个二进位。,(3),可以定义位数为,0,的位域成员,表示其下一个位域成员从下一个存储单元开始,此时该位域的位域名必须为空。,2024/11/22,Visual C+程序设计,18,(4),一个位域成员的长度不能大于一个存储单元的长度(,32,位)。,(5),位域变量的使用方法与结构体变量的使用方法完全一样。,(6),同一个存储空间中位域的分配方向随机器而异。,(7),当要存入一个成员中的数超过它所能表示的范围时,超过的高位将被去掉。,(8),位域的优点是可以节省存储空间,但在存取位域变量时,花费的时间较多。,2024/11/22,Visual C+程序设计,19,共同体,与结构一样,,共同体,也是一种派生类数据类型,但是其成员共享同一存储空间,即成员公用一个内存位置,可在不同的时间保存不同的数据类型和不同长度的变量。,2024/11/22,Visual C+程序设计,20,定义共同体类型的一般格式为:,union,;,;,共同体类型变量的说明方法与结构体类型变量的说明方法类似,也有三种方法。,一般情况下我们把结构和共同体定义在程序开头,然后在函数内定义结构变量和共同体变量。,2024/11/22,Visual C+程序设计,21,由于共同体中的成员占用同一个内存空间,该存储空间的大小为占用存储空间最大的成员所占用的字节数。另外,在使用一个共同体类型变量的成员之前必须先指定该成员的值。,共用体,成员的引用 同结构一样,可使用成员运算符,“,”,。但值得注意的是,在同一个时候只能引用一个成员,引用当前成员,其它成员的值会被覆盖。,只能对共同体变量的第一个成员初始化,不能对整体初始化。,2024/11/22,Visual C+程序设计,22,【,例,】,以下程序的运行结果是什么?,union u_type int i;char ch6;,/A,long s;struct st_type u_type u;float score3;,void,main()coutsizeof(struct st_type)endl;,20,考虑将,A,行改为:,char ch8,或,char ch10,或,char ch12,2024/11/22,Visual C+程序设计,23,枚举类型,(enum),2024/11/22,Visual C+程序设计,24,枚举是一种自定义类型,一个用标示符表示的,整型常数,的集合,枚举在日常生活中很常见。,例如表示星期的,SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,就是一个枚举。,枚举的说明与结构和共同体相似,其形式为,:,enum,枚举名,标识符,=,整型常数,,,标识符,=,整型常数,,,.,标识符,=,整型常数,,,枚举变量;,如果枚举没有初始化,即省掉,=,整型常数,时,则从第一个标识符开始,顺次赋给标识符,0,1,2,.,。但当枚举中的某个成员赋值后,其后的成员按依次加,1,的规则确定其值。,2024/11/22,Visual C+程序设计,25,例如下列枚举说明后,x1,x2,x3,x4,的值分别为,0,1,2,3,。,enum stringx1,x2,x3,x4 x;,当定义改变成,:,enum string,x1,x2=0,x3=50,x4,x;,则,x1=0,x2=0,x3=50,x4=51,2024/11/22,Visual C+程序设计,26,注意:,枚举中每个成员,(,标识符,),结束符是,“,,,”,不是,“,;,”,最后一个成员可省略,“,,,”,。,初始化时可以赋负数,以后的标识符仍依次加,1,。,枚举元素可以作为整型常量使用,可以直接输出。如:,enum colorRed,Green,Blue,;,coutGreenendl;/,此时结果为,1,可以用枚举类型说明枚举类型变量,而且也有与结构体类型类似的三种说明方法。,在说明枚举类型变量时,也可对它进行初始化,此时可将某一个枚举元素作为它的初始值。,2024/11/22,Visual C+程序设计,27,通常将某个枚举元素赋给枚举类型的变量,但也可将相应的整数赋给枚举类型的变量,不过此时一定要进行强制类型转换。不过,可以将枚举变量或枚举元素直接赋值给整型变量。,如:,enum colorRed=5,Green,Blue,;,.color c=Blue;,此时,枚举变量,c,实际上是,7,,即,coutcendl;,的,结果为,7,而不是,Blue,!但:,color c=7;,r,应该:,color c=(color)(7);,a,可以:,int a=c;,或,int a=Blue;,a,2024/11/22,Visual C+程序设计,28,例:定义一个描述三种颜色的枚举类型,(Red,Gree
展开阅读全文