第9章结构体共用体与枚举类型西安交大.ppt

上传人:sccc 文档编号:5641609 上传时间:2023-08-05 格式:PPT 页数:36 大小:522.01KB
返回 下载 相关 举报
第9章结构体共用体与枚举类型西安交大.ppt_第1页
第1页 / 共36页
第9章结构体共用体与枚举类型西安交大.ppt_第2页
第2页 / 共36页
第9章结构体共用体与枚举类型西安交大.ppt_第3页
第3页 / 共36页
第9章结构体共用体与枚举类型西安交大.ppt_第4页
第4页 / 共36页
第9章结构体共用体与枚举类型西安交大.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《第9章结构体共用体与枚举类型西安交大.ppt》由会员分享,可在线阅读,更多相关《第9章结构体共用体与枚举类型西安交大.ppt(36页珍藏版)》请在三一办公上搜索。

1、9.1结构体9.2结构体数组9.3结构体与指针9.4共用体9.5 枚举类型9.6用typedef定义类型,第9章 结构体、共用体与枚举类型,9.1 结构体,结构体是将不同类型的数据根据需要组合成一个有机的整体,以便于引用。这个整体是一个构造数据类型结构体类型,其中的数据是相互联系的。如要存储一个学生的有关信息(学号、姓名、性别、年龄、住址),可采用结构体数据结构描述上述信息。,struct studentint num;char name20;char sex;int age;char addr30;;,定义一个结构体类型的一般形式为:,struct 结构体名 成员表列;,是类型,不是变量名,

2、对各成员都要进行类型说明;成员名命名规则与变量名,定义结构体类型变量的方法,方法一:先定义结构体类型再定义变量struct studentint num;char name20;char sex;int age;char addr30;;struct student student1,student2;,定义studet1和sudent2为struct student类型变量,不能只指定一个变量为“struct型”而不指定结构体名,可用符号常量代表一个结构体类型,#define STUDENT struct studentSTUDENTint num;char name20;char sex;

3、int age;char addr30;,这样,可直接用STUDENT定义变量,如:STUDENT student1,student2;此时,不必再写关键字struct,方法二:在定义类型的同时定义变量,struct studentint num;char name20;char sex;int age;char addr30;student1,student2;,一般形式是:struct 结构体名 成员表列 变量名表列;,方法三:直接定义结构类型变量,其一般形式是:struct 成员表列 变量名表列;,此时,不出现结构体名,structint num;char name20;char sex

4、;int age;char addr30;student1,student2;,几点说明:,1.类型与变量是不同概念,不要混淆;2.结构体中的成员,可以单独使用,其作用与地位相当于普通变量;3.成员名可以与程序中的变量名相同,二者不代表同一对象。互不干扰。4.在结构中,各成员都占有自己的内存空间,它们是同时存在的。一个结构变量的总长度等于所有成员长度之和。,Sizeof()为一运算符,其功能是测试某种类型的变量在内存中所占用的字节数。,有:struct int i;char c;float a;test;sizeof(test)的值是:7,struct date int month;int d

5、ay;int year;Struct studentint num;char name20;int age;struct date birthday;student1,student2;,Struct studentint num;char name20;int age;struct int month;int day;int year;birthday;student1,student2;,5.成员也可以是一个结构体变量。例:,结构体类型变量的引用,引用一般形式为:结构体变量名.成员名规则:1.不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出。printf(“.”,s

6、tudent1);printf(“%d”,student1.num);输出 10010,错!,正确!,2.若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。如:student1.birthday.year,3.对成员变量可以象普通变量一样进行各种运算,如:sumage=student1.age+student2.age;4.可以引用成员的地址,也可以引用结构体变量的地址,如:scanf(“%d”,错!,输入student1.num的值,输出student1的首地址,Struct student int no;char name20;char sex;struct int

7、year;int month;int day;birth;Struct student s;,设变量s中的“生日”是“1984年11月11日”,下列对“生日”的正确赋值方式是:A)year=1984;month=11;day=11;B)birth.year=1984;birth.month=11;birth.day=11C)s.year=1984;s.month=11;s.day=11D)s.birth.year=1984;s.birth.month=11;s.birth.day=11;,练习:已知学生记录描述为:,结构体变量的初始化,在定义结构体类型变量的同时对其每个成员赋初值初始化。str

8、uct studentlong int num;char name20;char sex;char addr20;a=9801,”Wang hong”,W,”2 Linggong Road”;main()printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr);,运行结果为:No.:9801name:Wang hongsex:Waddress:2 Linggong Road,9.2 结构体数组(每个数组元素都是一个结构体类型的数据),结构体数组的定义:struct studentint num;char nam

9、e20;char sex;int age;char addr30;struct studnt stu3;,也可直接定义:struct student int num;stu3;或struct int num;stu3;,结构体数组的引用,1结构体数组元素中某一成员的引用 stu0.name 表示stu的第1个元素的name成员项 stu4.age 表示stu的第5个元素的age成员项2结构体数组元素的赋值 可将一个结构体数组元素赋给同一结构体数组中的另一个元素,或者赋给同一类型的变量。stu1=stu2;Stu4=stu5;注意:结构体数组元素的输入和输出只能将单个成员项进行输入和输出,而不能

10、把结构体数组元素作为一个整体直接进行输入和输出。,结构体数组的初始化,struct studentint num;char name20;char sex;int age;char addr30;stu3=111,”Li”,M,18,”Dalian”,;也可采用:struct student int num;struct student stu=,;,结构体数组的初始化的一般形式是在定义数组后面加上:=初值表列;,struct person char name20;int count;leader3=“Li”,0,”zhang”,0,”Liu”,0;main()int i,j;char lea

11、der_name20;for(i=1;i=10;i+)scanf(“%s”,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+);for(i=0;i3;i+)printf(“%5s:%dn”,leaderi.name,leaderi.count);,判断是哪一位候选人,例题:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,计算学生的平均成绩和不及格的人数。,struct stuint num;char*name;char sex;float score;boy

12、5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58,;,main()int i,c=0;float ave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.score60)c+=1;printf(s=%fn,s);ave=s/5;printf(average=%fncount=%dn,ave,c);,9.3 结构体与指针,结构体变量的指针是该结构体变量所占据的内存段的起始地址如:main()struct student

13、long int num;char name20;char sex;struct student stu_1;struct student*p;p=&stu_1;,stu.num=9901;strcpy(stu_1.name,”Li Min”);stu_1.sex=W;printf(“No.:%ldnname%snsex:%cn”,stu_1.num,stu_1.name,stu_1.sex);printf(“nNo.:%ldnname%snsex:%cn”,(*p).num,(*p).name,(*p).sex);,指针的定义,引用结构体成员的三种形式:结构体变量名.成员名(*p).成员名p

14、-成员名,指向运算符。其优先级高于自增、自减运算符,试分析以下运算:p-n 得到p指向的结构体变量中的成员n的值p-n+得到p指向的结构体变量中的成员n的值,用完后使它加1;+p-n 得到p指向的结构体变量中的成员n的值 使其先加1,成员运算符,指向结构体数组的指针,类似与多维数组中指向一维数组的指针。例:#includestring.h#includestdio.h struct student int num;char name20;char sex;int age;,struct student stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10

15、104,Wang Min,F,20;void main()struct student*p;printf(No.Name Sex agen);for(p=stu;pnum,p-name,p-sex,p-age);注意:p定义为struct student类型,它只能指向这种类型的结构体变量,而不能指向该类型的成员(p=&stu.name是错误的)其它类型的结构体变量。,用结构体变量和指向结构体的指针作为函数参数,将一个结构体变量的值传递给另一个函数有3个方法:用结构体变量的成员作参数,将实参值传给形参 用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参和形参的类型保持一致。2.用

16、结构体变量作实参 此方法采用的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用其间形参也要占用内存单元。这种传递方式在空间和时间上开销较大。此外,由于采用值传递方式,如果在执行被调用函数其间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往造成使用上的不便。因此一般较少用这种方法。3.用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,#includestdio.h#define format%dn%sn%fn%fn%fn struct student int num;char name2

17、0;char sex;float score3;,void main()void print();struct student stu;stu.num=12345;strcpy(stu.name,Li Li);stu.score0=67.5;stu.score1=89;stu.score2=78.6;printf(,void print(p)struct student*p;printf(format,p-num,p-name,p-score0,p-score1,p-score2);printf(n);,9.4 共用体,共用体是使用覆盖技术将几个不同类型的变量置于同一段内存,虽然它们各自占的内

18、存长度不同,但起始地址相同。共用体定义的一般形式:union共用体名成员表列变量表列;结构体和共用体机制上的区别:结构体所占内存长度是各成员占的长度之和。即每个成员分别占有其自己的内存单元。共用体变量所占内存长度是最长的成员的长度。,例如:union aint i;char ch;float f;a,b,c;,已知:union int i;char c;float a;test;则:sizeof(test)的值是:4,共用体数据的特点,1)同一个内存段可以用来存放几种不同类型的成员变量,但在每个瞬间只能存放其中一种,而不是同时存放几种。起作用的是最后依次存放的成员。如经过以下三次赋值后,只有a

19、.f=1.5有效。a.i=1;a.ch=a;a.f=1.5;2)共用体变量的地址和它的各成员的地址都是同一个地址 3)不能对共用体变量名赋值。也不能企图引用变量名得到成员值,不能在定义共用体变量时对它初始化。下面是错误的:(1)union int i;char ch;float f;a=a,a,1.5;(2)a=1;(3)m=a;,4)在函数间传递共用体时,只能使用指针的方法。5)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。要作如下表格的数据管理,对教师(“T”)要注明职务(“position”),对学生(“

20、S”)要注明班级(“class”)。由于数据的不完全一致,对班级和职务要用到共用体。,struct int num;char name10;char sex;char job;union int class;char position10;category;person2;,main()int n,i;for(i=0;i2;i+)scanf(%d%s%c%c,printf(n);printf(No.name sex job class/positionn);for(i=0;i2;i+)if(personi.job=s)printf(%-6d%-10s%-3c%-3c%-6dn,personi.

21、num,personi.name,personi.sex,personi.job,personi.category.class);else printf(%-6d%-10s%-3c%-3c%-6sn,personi.num,personi.name,personi.sex,personi.job,personi.category.position);,9.5 枚举类型,如果变量只有几种可能的值,可以定义为枚举类型。它是把变量的值一一列举出来。变量只能取列举出的值。枚举类型定义一般方法:enum weekday sun,mon,tue,wed,thu,fri,sat;变量声明方法:enum we

22、ekday workday,week_end;workday和week_end被定义为枚举变量,它们只能取值于sun到sat之一。如:workday=mon;week_end=sum;是正确的。,1在C编译中,对枚举按常量处理,故称枚举常量。不能对它们赋值。例如:Mon=1;Sun=7;是错误的。2枚举元素作为常量,它们是有值的,如果没有进行初始化,第一个枚举元素的值是0,第二个枚举元素的值为1,依此类推。例如,对上述枚举变量wordkay来说,如下语句:workday=Fri;printf(“%d”,workday);输出结果是4。也可以改变枚举元素的值,在定义时由程序指定,例如:enum

23、weekday Mon=1,Tue,Wed,Thu,Fri,Sat,Sun workday;定义Mon为1,以后顺序加1,Sun为7。3枚举类型变量只能取枚举元素表中的某个元素,而不能是其它值。不能把整数直接赋给枚举变梁。例如:workday=2;是错误的。它们属于不同的类型。应先进行强制类型转换才能赋值。例如:workday=(enum weekday)2;甚至可以是表达式。例如:workday=(enum weekday)(5-3);4枚举值可以用来作判断比较。例如:if(workday=Mon)枚举值的比较规则是:按其在定义时的顺序号比较。顺序号大,枚举值也大。如果workday=Fri

24、,那么workday就大于Tue。,枚举类型的变量在使用时要注意以下几点:,例:已知今天是星期日,编写一个程序,求若干天后是星期几。,#include void main()int n;enum sun,mon,tue,wed,thu,fri,sat day;char weekday77=星期日,星期一,星期二,星期三,星期四,星期五,星期六;printf(输入间隔天数:);scanf(%d,9.6 用typedef定义类型,C语言允许用typedef说明一种新的类型名,新的类型名即可当做原类型标识符来使用,用它来定义变量,其一般形式为:typedef 其中,typedef是类型定义关键字;原

25、类型标识符指的是已有的类型标识符,如int、float、已定义过的结构体、共用体、枚举等;新类型标识符是用户自行定义的标识符,用来代替原类型标识符。例如:typedef int INTEGER;typedef flaot REAL;可以用新定义的类型标识符去说明变量、数组、结构体、共用体、枚举等。例如:INTEGER i,j;它们等价于:int i,j;REAL a,b;float a,b;,9.6 用typedef定义类型,1.数组typedef char STRING80;STRING s1,s2;等价于:char s180,s2802.指针typedef int*PINT;PINT p1

26、,p2;等价于:int*p1,*p2;,用typedef除了可以定义基本类型外,还可以定义其它各种已经定义过的类型:,3.函数typedef char FCH();FCH af;等价于:char af();,4.结构体typedef struct date int year;int month;int day;DATE;DATE dt;等价于:struct date dt;,1)用typedef可以把已有的各种类型名定义成新的类型名,但不能直接定义变量。2)typedef只是对已有的数据类型名增加一个新的替换名,并不能创造新的数据类型,也不取代现有的数据类型名。现有的数据类型名可以继续使用。3)用typedef定义了一个新类型后,可以再用typedef将新类型名定义成另一个新的类型名,即嵌套定义。4)typedef与#define有相似之处,例如:typedef int INTEGER;与#define INTEGER int都是用INTEGER代表int,但#define是在预编译时处理的,它只能做简单的字符串替换,而typedef是在编译时处理的,并不是做简单的字符替换。例如,前面介绍的定义数组:typedef char STRING80;STRING s;并不是将STRING80替换成char,而是相当于定义:char s80;,使用typedef时,要注意以下几点,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号