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

上传人:本田雅阁 文档编号:2258266 上传时间:2019-03-12 格式:PPT 页数:36 大小:522.01KB
返回 下载 相关 举报
第9章结构体共用体与枚举类型-西安交大.ppt_第1页
第1页 / 共36页
第9章结构体共用体与枚举类型-西安交大.ppt_第2页
第2页 / 共36页
第9章结构体共用体与枚举类型-西安交大.ppt_第3页
第3页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

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

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

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

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

5、char c; float a; test; sizeof(test)的值是:7,struct date int month; int day; int year; ; Struct student int num; char name20; int age; struct date birthday; student1,student2;,Struct student int num; char name20; int age; struct int month; int day; int year; birthday; student1,student2;,5. 成员也可以是一个结构体变量

6、。例:,结构体类型变量的引用,引用一般形式为:结构体变量名.成员名 规则: 1. 不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出。 printf(“”,student1); printf(“ %d”, student1.num); 输出 10010,错!,正确!,2 .若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。 如:student1.birthday.year,3. 对成员变量可以象普通变量一样进行各种运算,如: sumage=student1.age+student2.age; 4. 可以引用成员的地址,也可以引用结构体变量的地址,如:

7、 scanf(“%d”,错!,输入student1.num的值,输出student1的首地址,Struct student int no; char name20; char sex; struct int 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=11 C)s.year=1984;s.month=11;s

8、.day=11 D)s.birth.year=1984;s.birth.month=11;s.birth.day=11;,练习:已知学生记录描述为:,结构体变量的初始化,在定义结构体类型变量的同时对其每个成员赋初值初始化。 struct student long 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);,运行结

9、果为: No.:9801 name:Wang hong sex:W address:2 Linggong Road,9.2 结构体数组 (每个数组元素都是一个结构体类型的数据),结构体数组的定义: struct student int num; char name20; char sex; int age; char addr30; ; struct studnt stu3;,也可直接定义: struct student int num; stu3; 或struct int num; stu3;,结构体数组的引用,1结构体数组元素中某一成员的引用 stu0.name 表示stu的第1个元素的n

10、ame成员项 stu4.age 表示stu的第5个元素的age成员项 2结构体数组元素的赋值 可将一个结构体数组元素赋给同一结构体数组中的另一个元素,或者赋给同一类型的变量。 stu1 = stu2; Stu4 = stu5; 注意:结构体数组元素的输入和输出只能将单个成员项进行输入和输出,而不能把结构体数组元素作为一个整体直接进行输入和输出。,结构体数组的初始化,struct student int num; char name20; char sex; int age; char addr30; stu3=111,”Li”,M,18,”Dalian”,; 也可采用:struct stude

11、nt int num; ; struct student stu=,;,结构体数组的初始化的一般形式是在 定义数组后面加上: =初值表列;,struct person char name20; int count; leader3=“Li”,0,”zhang”,0,”Liu”,0; main( ) int i, j; char leader_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

12、=0;i3;i+) printf(“%5s:%dn”,leaderi.name,leaderi.count); ,判断是哪一位候选人,例题:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,计算学生的平均成绩和不及格的人数。,struct stu int num; char *name; char sex; float score; boy5= 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, ;

13、,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 long int num; char name20; char sex; ; struct student stu_1; struct student *p; p

14、=&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%sn sex:%cn”,(*p).num,(*p).name,(*p).sex); ,指针的定义,引用结构体成员的三种形式: 结构体变量名 . 成员名 (*p).成员名 p- 成员名,指向运算符。其优先级高于自增、自减运算符,试分析以下运算: p-n 得到p指向的结构体变量中的成员n的值 p-

15、n+ 得到p指向的结构体变量中的成员n的值, 用完后使它加1; +p-n 得到p指向的结构体变量中的成员n的值 使其先加1,成员运算符,指向结构体数组的指针,类似与多维数组中指向一维数组的指针。例: #include“string.h“ #include“stdio.h“ struct student int num; char name20; char sex; int age; ;,struct student stu3=10101, “Li Lin“, M, 18, 10102, “Zhang Fun“, M, 19, 10104, “Wang Min“, F, 20; void mai

16、n() 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.用结构体变量作实参 此

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

18、 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 共用体,共用体是使用覆盖技术将

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

20、放其中一种,而不是同时存放几种。起作用的是最后依次存放的成员。如经过以下三次赋值后,只有a.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)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型

21、定义中,数组也可以作为共用体的成员。 要作如下表格的数据管理,对教师(“T”)要注明职务(“position”),对学生(“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 jo

22、b class/positionn“); for (i=0; i2; i+) if (personi.job=s) printf(“%-6d%-10s%-3c%-3c%-6dn“, personi.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 枚举类型,如果

23、变量只有几种可能的值,可以定义为枚举类型。它是把变量的值一一列举出来。变量只能取列举出的值。 枚举类型定义一般方法: enum weekday sun, mon, tue, wed, thu, fri, sat; 变量声明方法: enum weekday workday, week_end; workday和week_end被定义为枚举变量,它们只能取值于sun到sat之一。如: workday=mon; week_end=sum; 是正确的。,1在C编译中,对枚举按常量处理,故称枚举常量。不能对它们赋值。例如: Mon = 1; Sun = 7; 是错误的。 2枚举元素作为常量,它们是有值的

24、,如果没有进行初始化,第一个枚举元素的值是0,第二个枚举元素的值为1,依此类推。例如,对上述枚举变量wordkay来说,如下语句: workday = Fri;printf(“%d”,workday); 输出结果是4。 也可以改变枚举元素的值,在定义时由程序指定,例如: enum weekday Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun workday; 定义Mon为1,以后顺序加1,Sun为7。 3枚举类型变量只能取枚举元素表中的某个元素,而不能是其它值。不能把整数直接赋给枚举变梁。例如:workday = 2 ;是错误的。它们属于不同的类型。应先进行强制类型转换才能赋

25、值。例如:workday = (enum weekday) 2;甚至可以是表达式。例如:workday = (enum weekday) (5-3); 4枚举值可以用来作判断比较。例如:if (workday = Mon) 枚举值的比较规则是:按其在定义时的顺序号比较。顺序号大,枚举值也大。如果workday = Fri,那么workday就大于Tue。,枚举类型的变量在使用时要注意以下几点:,例:已知今天是星期日,编写一个程序,求若干天后是星期几。,#include void main() int n; enum sun,mon,tue,wed,thu,fri,sat day; char w

26、eekday77 = “星期日“,“星期一“,“星期二“, “星期三“,“星期四“,“星期五“,“星期六“; printf(“输入间隔天数:“); scanf(“%d“, ,9.6 用typedef定义类型,C语言允许用typedef说明一种新的类型名,新的类型名即可当做原类型标识符来使用,用它来定义变量,其一般形式为: typedef 其中,typedef是类型定义关键字;原类型标识符指的是已有的类型标识符,如int、float、已定义过的结构体、共用体、枚举等;新类型标识符是用户自行定义的标识符,用来代替原类型标识符。 例如:typedef int INTEGER; typedef fla

27、ot 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,s280 2.指针 typedef int *PINT; PINT p1,p2; 等价于: int *p1,*p2;,用typedef除了可以定义基本类型外,还可以定义其它各种已经定义过的类型:,3.函数 typedef char FCH(); FCH af;

28、等价于: 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备18001539号-1