《━━结构体、枚举类型.ppt》由会员分享,可在线阅读,更多相关《━━结构体、枚举类型.ppt(31页珍藏版)》请在三一办公上搜索。
1、C+程序设计,第4章(4)结构体、枚举类型,主要内容,结构体类型的定义结构体变量的定义结构体变量的使用结构体数组结构体中的静态成员位域(选读)共同体(选读)枚举类型的定义枚举变量的定义和使用,结构体类型的定义,结构体属于构造数据类型:数组是一组相同类型数据组成的集合体;结构体是若干个不同类型数据组成的集合体。结构体弥补了数组的不足,使得一个结构体数据可以包含多种类型的数据项。一个结构体类型由若干个不同类型的成员数据项组成,用一个类型名来命名,这样就可将这些不同类型的成员数据项作为一个整体来处理。【例】描述学生的数据项有:学号、姓名、性别、成绩,可将这些不同类型的数据项 作为一个整体来处理,定义
2、一个名为 student 的数据类型,包括 id、name、sex、score 四个成员数据项,那么 student 就是一个结构体类型。struct student int id;char name 10;char sex;float score;,结构体类型的定义,结构体类型的定义:struct 结构体类型名 类型 成员名1;类型 成员名2;类型 成员名 n;/此处分号不可缺少几点说明:结构体类型名按标识符命名规则命名。注意:结构体类型是一种构造的数据类型,定义一个结构体类型,就是定义该结构体中成员的结构框架,编译系统不为任何数据类型分配存储空间,当然也不为结构体类型分配存储空间!结构体成
3、员花括号中依次列出组成该结构体类型的各个成员,并对各成员进行类型声明,成员的类型可以是C+中任意基本数据类型,也可以是已定义的构造数据类型。注意:声明成员时,不能指定其存储类型为:auto、register、extern,因为系统并不为结构体类型分配存储空间,但可以指定成员的存储类型为 static,关于结构体中 static 静态成员的作用本章后续介绍。,结构体变量的定义,结构体变量的定义:格式1:存储类型 结构体类型名 变量名1,变量名2;格式2:存储类型 struct 结构体类型名 变量名1,变量名2;几点说明:存储类型有 auto、static、register、extern 四种。当
4、存储类型省略时,对于局部结构体变量,表示auto。定义结构体变量时,系统按结构体类型中的成员框架为其分配一段连续的存储空间,依次存放各个成员的数据,所占内存的字节数为各个成员所占字节数之和。结构体变量的作用域与一般变量的作用域相同,全局结构体变量具有文件作用域,局部结构体变量具有块作用域。结构体变量的生存期也与一般变量的生存期相同,全局结构体变量、static静态局部结构体变量存放在静态区,auto局部结构体变量存放在栈区。,结构体变量的定义,定义结构体变量的方法有三种:先定义结构体类型,再定义结构体类型的变量。定义结构体类型的同时,紧跟着定义结构体类型的变量。定义无名的结构体类型,并同时定义
5、结构体类型的变量。【例】#include struct person int id;char name 10;struct date int year;int month;int day;d1;/定义结构体类型的同时,紧跟着定义其变量。struct int hour;/无名结构体类型 int minute;int second;t1,t2;/定义无名结构体类型,并同时定义其变量。person p1,p2;/先定义结构体类型,再定义结构体变量。,结构体变量的使用,结构体变量的初始化:与数组类同,在定义结构体变量时,用花括号将每一个成员的初值括起来赋给该变量。注意,花括号中列出初值其类型和顺序必须
6、与结构体类型定义中所声明的成员一一对应。【例】student s1=408001,“张小笑”,F,98;结构体变量成员的引用:(使用成员运算符“.”)结构体变量名.成员名几点说明:同类型的结构体变量之间可以相互赋值,这种赋值等同于各个成员的依次赋值。结构体变量不能直接进行输入/输出,它的每一个成员能否直接进行输入/输出,取决于其成员的类型,若是基本数据类型或字符数组,则可以直接进行输入/输出。,【例】#include#includestruct student int id;char name 10;char sex;float score;void main()student s1=4080
7、01,“张小笑”,m,98;cout s2.id s2.name s2.sex s2.score;cout“s2=”s2.id t s2.name t s2.sex t s2.score endl;s3=s2;cout“s3=”s3.id t s3.name t s3.sex t s3.score endl;s3.id=408003;strcpy(s3.name,“王嘻嘻”);cout“s3=”s3.id t s3.name t s3.sex t s3.score endl;,运行:s1=408001 张小笑 m 98请输入学号、姓名、性别(m/f)、成绩:408002 王哈哈 f 88 s2
8、=408002 王哈哈 f 88s3=408002 王哈哈 f 88 s3=408003 王嘻嘻 f 88,结构体变量的使用,结构体中成员的类型可以是C+中任意基本数据类型,也可以是已定义的构造数据类型,因此当然可以是已定义的结构体类型,当要访问嵌套在内层的结构体成员时,同样使用成员运算符“.”来实现。【例】#includestruct date int year;int month;int day;struct student int id;char name 10;char sex;date birthday;float score;void main()student s=408001,
9、“张小笑”,m,1991,5,15,98;cout s.id t s.name t s.sex t t;cout t t s.score endl;,运行:408001 张小笑 m 1991 5 15 98,结构体变量的使用,结构体变量与一般变量一样,可以作为函数的参数,同样结构体类型也可以作为函数返回值的类型。【例】#includestruct complex float real,image;/定义一个表示复数的结构体类型void swap1(complex c1,complex c2)complex t;t=c1;c1=c2;c2=t;void swap2(complex,void ma
10、in()complex c1=5,7,c2=3,2,c3;cout“c1=(”c1.real“,”c1.image“i)n”;cout“c2=(”c2.real“,”c2.image“i)nn”;swap1(c1,c2);cout“c1=(”c1.real“,”c1.image“i)n”;cout“c2=(”c2.real“,”c2.image“i)nn”;swap2(c1,c2);cout“c1=(”c1.real“,”c1.image“i)n”;cout“c2=(”c2.real“,”c2.image“i)nn”;c3=add(c1,c2);cout“c3=(”c3.real“,”c3.i
11、mage“i)n”;,运行:c1=(5,7i)c2=(3,2i)c1=(5,7i)c2=(3,2i)c1=(3,2i)c2=(5,7i)c3=(8,9i),结构体数组,结构体数组:数组是一组相同类型的元素组成的集合体,而数组元素的类型当然可以是已定义的结构体类型,这种由结构体变量组成的数组称为结构体数组。【例】(结构数组)#includestruct student int id;char name 10;char sex 4;float score;void input(student,void sort(student s,int n)int i,j;student t;for(i=0;i
12、n-1;i+)for(j=i+1;jn;j+)if(s i.score s j.score)t=s i;s i=s j;s j=t;void main()int i;student s 4;for(i=0;i4;i+)input(s i);cout“排序前:n”;for(i=0;i4;i+)output(s i);sort(s,4);cout“排序后:n”;for(i=0;i4;i+)output(s i);,【例】(有三位侯选人,输入各张选票上得票人的名字,统计出各人的得票数。)#include#includestruct person char name 10;int count;void
13、 main()int i;char name 10;person leader 3=“王哈哈”,0,“肖嘻嘻”,0,“乐咪咪”,0;cout name;while(strcmp(name,“0”)!=0)for(i=0;i name;cout“统计结果:n”;for(i=0;i3;i+)cout leader i.name“=”leader i.count“tt”;cout endl;,运行:请输入得票人姓名(输入0结束):王哈哈 肖嘻嘻 肖嘻嘻 王哈哈 肖嘻嘻 肖嘻嘻 乐咪咪 王哈哈 肖嘻嘻 王哈哈 乐咪咪 肖嘻嘻 肖嘻嘻 乐咪咪 王哈哈 肖嘻嘻 0 统计结果:王哈哈=5 肖嘻嘻=8 乐咪咪
14、=3,结构体中的静态成员,结构体中的静态成员:若将结构体类型中某个成员的存储类型定义为 static 静态成员,则对于这种结构体类型的所有变量,编译程序只为该static成员分配一个存储空间,即这种结构体类型的所有变量共享该static成员的存储空间。在结构体类型中声明static成员是属于引用性声明,必须在文件作用域的某一个地方对static成员进行一次且仅能一次的定义性声明。对结构体类型中的静态成员进行定义性声明的格式:类型 结构体类型名:静态成员名;该声明语句的作用是为该静态成员分配存储空间,可同时为其赋初值,若未赋初值,其初值为0。,指向结构体的指针,结构体的指针:在创建结构体变量时,
15、编译系统会为每一个结构体变量分配一定的存储空间,以存放其成员数据。结构体变量空间的起始地址就是结构体的指针。指向结构体的指针变量的定义:存储类型 结构体类型名*指针变量名=结构体起始地址 通过结构体指针引用结构体中的 public 成员:格式1:通过指针成员运算符-结构体指针-成员名 格式2:通过点成员运算符.(*结构体指针).成员名,【例】#includestruct student int id;char name 10;float score;void main()student s=408001,“张小笑”,98;student*p=,运行:s=408001 张小笑 98s=40800
16、1 张小笑 98s=408001 张小笑 98,【例】(结构体中的static静态成员)#includestruct student int id;char name 10;char sex 4;float score;static int count;/静态成员,引用性声明;int student:count=3;/静态成员,定义性声明void main()student s1,s2;cout“s1:”s1.count endl;cout“s2:”s2.count endl;s2.count=6;cout“s1:”s1.count endl;cout“s2:”s2.count endl;,运
17、行:3 6 6,位域(选读),位域:位域:指在一个字或字节中,用若干个二进制位来建立若干个标志位(一个标志用0或1来表示),具体作法是将一个字或一个字节根据需要划分成若干个位域。位域的定义:就是定义一个结构体类型,在结构体类型中指定每一个成员占用的二进制位数,即位域。一个位域成员的长度不能大于一个字的长度。位域类型的定义:struct 结构体类型名 unsigned 位域名1:二进制位数;unsigned 位域名2:二进制位数;unsigned 位域名n:二进制位数;/此处分号不可缺少,位域(选读),几点说明:位域名按标识符命名规则命名。位域的成员类型必须是无符号整型。一个结构体类型中定义的任
18、何一个位域都必须在同一个字中,若本字中剩余的二进制位数不够定义一个位域时,则该字的剩余二进制位不用,而从下一个字开始。若需要跳过某些不用的二进制位,也可定义一个无名的位域。【例】struct data unsigned flag1:2;unsigned flag2:4;unsigned:2;/无名位域,跳过2个不用的二进制位 unsigned flag3:6;unsigned flag4:2;,位域(选读),位域变量的定义:(等同于结构体变量的定义)格式1:存储类型 结构体类型名 变量名1,变量名2;格式2:存储类型 struct 结构体类型名 变量名1,变量名2;位域变量的使用:(等同于结构
19、体变量的使用)同类型的位域变量之间可以相互赋值,这种赋值等同于各个成员的依次赋值。位域变量与结构体变量一样,也可以作为函数的参数。位域变量不能直接进行输入/输出,位域变量的每个成员都是作为一个整型变量来使用,但是其取值范围受到指定给其的二进制位数限制,若所赋的值大于该成员所能表示的范围,超过的高位部分被舍弃,即按取模后的数存入该成员。使用位域的目的是节省内存空间,但存取位域变量值时所花费的时间较多,若内存足够大,使用位域就没有意义了。位域变量主要用于系统程序设计中。,【例】(位域)#include#includestruct data unsigned f1:2;unsigned f2:4;u
20、nsigned:2;unsigned f3:6;unsigned f4:2;void main()data d1,d2;d1.f1=5;d1.f2=5;d1.f3=0 x3f;d1.f4=3;cout“d1:”setw(10)d1.f1 setw(10)d1.f2;cout setw(10)d1.f3 setw(10)d1.f4;cout“tt字节数:”sizeof(d1)endl;d2=d1;cout“d2:”setw(10)d2.f1 setw(10)d2.f2;cout setw(10)d2.f3 setw(10)d2.f4;cout“tt字节数:”sizeof(d2)endl;,运行:
21、d1:1 5 63 3 字节数:4 d2:1 5 63 3 字节数:4,共同体(选读),共同体(联合体)属于构造数据类型:指将不同类型的变量组织成一个整体,利用内存覆盖技术,使它们在内存中共用同一段存储区域。共同体与结构体区别:结构体变量所占内存长度是各成员所占内存长度之和,各成员独自占有自己的内存区域。而共同体变量所占内存长度是其最长成员的长度,各成员共用同一段内存区域。共同体类型的定义:union 共同体类型名 类型 成员名1;类型 成员名2;类型 成员名 n;/此处分号不可缺少说明:对结构体类型所作的说明也适用于共同体。,共同体(选读),共同体变量的定义:(雷同于结构体变量的定义)格式1
22、:存储类型 共同体类型名 变量名1,变量名2;格式2:存储类型 union 共同体类型名 变量名1,变量名2;共同体变量的使用:一个共同体变量中的所有成员共用同一段内存区域,共同体变量所占内存区域的大小由占用最大内存区域的成员所决定。任一时刻,一个共同体变量中只能有一个成员起作用。定义共同体变量时不能对其进行初始化。使用共同体的目的是节省内存空间,现在内存越来越大,通常的程序设计中已较少使用。共同体主要用于计算机底层的程序设计中。共同体变量成员的引用:(使用成员运算符“.”)共同体变量名.成员名,【例】(共同体)#include#includeunion data char a;int b;s
23、hort m;float n;void main()data d;d.b=39000;cout“各成员值:”setw(4)d.a setw(12)d.b;cout setw(12)d.m setw(20)d.n endl;d.a=A;cout“各成员值:”setw(4)d.a setw(12)d.b;cout setw(12)d.m setw(20)d.n endl;cout“字节数=”sizeof(d)“t首地址=”(int),运行:各成员值:X 39000-26536 5.46506e-041 各成员值:A 38977-26559 5.46184e-041字节数=4 首地址=1245052
24、a地址=1245052 b地址=1245052 c地址=1245052 d地址=1245052,枚举类型的定义,枚举类型属于构造数据类型:如果一个变量仅有几种可能的取值,可以定义为枚举类型的变量。在定义枚举类型的变量之前,必须先定义枚举类型。枚举类型是指将可能的取值一一列举出来,对于该枚举类型的变量,其取值仅限于列举出来的范围内。枚举类型是为了一些具有特殊“离散”值域的数据而引入的。【例】对于取值于“星期几”的数据,可定义一个名为 weekday 的数据类型,该类型的变量取值仅限于 sun、mon、tue、wed、thu、fri、sat 七个中的一个,那么 weekday 就是一个枚举类型。e
25、num weekday sun,mon,tue,wed,thu,fri,sat;weekday w1=mon;/w1是weekday类型的变量 weekday w2=sat;/w2是weekday类型的变量,枚举类型的定义,枚举类型的定义:enum 枚举类型名 枚举常量1,枚举常量2,,枚举常量n;几点说明:枚举常量(枚举元素)是以标识符形式表示的整型量,不是字面常量。各枚举常量代表该枚举类型变量的可能取值,它们之间以“,”分隔。编译器为每个枚举常量指定一个内部整数值,默认状态下,这个整数值就是列举时的顺序号,序号从0开始,按列举顺序依次为:0、1、2、3、.。【例】enum color re
26、d,yellow,blue,black,white;则枚举常量 red、yellow、blue、black、white 的值分别是:0、1、2、3、4。,枚举类型的定义,定义枚举类型时,也可为部分或全部的枚举常量另行指定整数值,而对于具有指定值后面那些无指定的枚举常量,则按依次加1的原则取值。注意,各枚举常量的整数值可以相同,但各枚举常量的标识符必须不同。【例】enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;则枚举常量 sun、mon、tue、wed、thu、fri、sat 的值分别是:7、1、2、3、4、5、6。【例】enum fruit apple
27、,orange,banana,peach=1,grape;则枚举常量 apple、orange、banana、peach、grape 的值分别是:0、1、2、1、2。定义枚举类型的主要目的是增加程序的可读性。枚举类型最常见的用途之一就是用来描述状态量。,枚举变量的定义和使用,枚举变量的定义:格式1:存储类型 枚举类型名 变量名1,变量名2;格式2:存储类型 enum 枚举类型名 变量名1,变量名2;几点说明:存储类型有 auto、static、register、extern 共四种。当存储类型省略时,对于局部枚举变量,则表示auto。枚举变量在内存中存放的是其枚举常量所对应整数值,即枚举变量占
28、用内存的大小与整型数相同。枚举变量的作用域与一般变量的作用域相同,全局枚举变量具有文件作用域,局部枚举变量具有块作用域。枚举变量的生存期也与一般变量的生存期相同,全局枚举变量、static静态局部枚举变量存放在静态区,auto局部枚举变量存放在栈区。,枚举变量的定义和使用,枚举变量允许的操作:赋值运算、关系运算 可以将一个枚举常量赋值给枚举变量,但不可以将一个整数直接赋值给枚举变量。同枚举类型的两个变量之间可以相互赋值,但不同枚举类型的两个变量之间不能相互赋值。【例】#includeenum color red,yellow,blue,black,white;void main()color
29、c1,c2,c3;c1=yellow;c2=(color)3;/不能写成:c2=3;c3=c2;cout“c1=”c1“t占字节数=”sizeof(c1)endl;cout“c2=”c2“t占字节数=”sizeof(c2)endl;cout“c3=”c3“t占字节数=”sizeof(c3)endl;,运行:c1=1 占字节数=4c2=3 占字节数=4c3=3 占字节数=4,枚举变量的定义和使用,由于枚举常量本身是一个整数值,可将其直接赋值给整型变量。另外,枚举变量不能直接输入,但可以直接输出,输出的是枚举变量的内部整数值。同枚举类型的两个变量之间、或同枚举类型的变量与常量之间可以进行关系运算,是按它们的整数值进行比较。【例】#includeenum color red,yellow,blue,black,white;void main()color c1,c2;c1=yellow;c2=blue;if(c1 c2)cout red)cout“c1 大于 redn”;else cout“c1 小于 redn”;int a=white;cout“a=”a“tblue=”blue endl;,运行:c1 小于 c2c1 大于 reda=4 blue=2,