第8章 用户定义类型_第1页
第8章 用户定义类型_第2页
第8章 用户定义类型_第3页
第8章 用户定义类型_第4页
第8章 用户定义类型_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 耿小庆耿小庆 8-1 8-1 结构体结构体 8-2 8-2 联合体联合体 8-3 8-3 枚举枚举 8-4 8-4 类型定义类型定义为什么要使用结构体呢?为什么要使用结构体呢?什么是结构体?什么是结构体?结构体就是把一种对结构体就是把一种对象的所有属性封装在象的所有属性封装在一起,形成一个统一一起,形成一个统一的整体。的整体。假设现在开发一个系统,其中有学生、假设现在开发一个系统,其中有学生、教师、教室等对象,而这些对象都具教师、教室等对象,而这些对象都具有编号、名称等属性,若不使用结构有编号、名称等属性,若不使用结构体,则必须使用体,则必须使用studentNum、teacherNum、c

2、lassroomNum、 studentName、teacherName、classroomName等等,哇,太麻烦等等,哇,太麻烦了!了!8-1 结构体结构体8.1.1 结构(类型)的定义结构(类型)的定义 结构(类型)的定义是对结构体的描述,结构的定结构(类型)的定义是对结构体的描述,结构的定义并不引起系统为该结构分配内存空间,只是制定义并不引起系统为该结构分配内存空间,只是制定了结构使用的内存模式。了结构使用的内存模式。 定义形式定义形式 struct struct 结构类型名结构类型名 数据类型数据类型 成员名成员名1;1; 数据类型数据类型 成员名成员名2;2; 数据类型数据类型 成

3、员名成员名n;n; ; ;struct student struct student int num; int num; char name10; char name10; int age; int age; float score; float score; char address30; char address30; ;8.1.2 结构变量结构变量 说明说明 存储类型存储类型 struct struct 结构类型名结构类型名 结构变量名;结构变量名;struct student struct student int num; int num; char name10; char name

4、10; int age; int age; float score; float score; char address30; char address30; ;struct student a;struct student a;struct struct studentstudent int num; int num; char name10; char name10; int age; int age; float score; float score; char address30; char address30; a;a;8.1.2 结构变量结构变量a anumnumnamenamea

5、geagescorescoreaddressaddress2字节字节10字节字节2字节字节4字节字节30字节字节48字节字节&a=&a.numn存储:结构变量说明时分配内存;结构变量按成员存储:结构变量说明时分配内存;结构变量按成员定义的顺序存储在连续的内存单元中。定义的顺序存储在连续的内存单元中。8.1.2 结构变量结构变量 成员的引用成员的引用 结构变量名结构变量名. .成员名成员名 初始化初始化 struct student a=1,”Mary”,20,90,” ”;struct student a=1,”Mary”,20,90,” ”; 输入输出输入输出 不允许直接输入

6、输出不允许直接输入输出 scanf(“%d%s%d%f%s”,&a.num,,&a.age,scanf(“%d%s%d%f%s”,&a.num,,&a.age, &a.score,a.address); &a.score,a.address); printf(“no:%d,name:%s,age:%d,score:%f,naddresprintf(“no:%d,name:%s,age:%d,score:%f,naddress:%s”,a.num,,a.age,a.score,a.address);s:%s”,a

7、.num,,a.age,a.score,a.address);8.1.2 结构变量结构变量 结构的嵌套结构的嵌套 结构体可以嵌套,即成员可以是另一结构的变量结构体可以嵌套,即成员可以是另一结构的变量 结构体嵌套,只能对最低一级成员进行赋值、输入结构体嵌套,只能对最低一级成员进行赋值、输入输出等运算输出等运算struct date struct date int year; int year; int month; int month; int day; int day; ;struct studentstruct student int num; int num; struct d

8、ate birthdate; struct date birthdate; . .;8.1.2 结构变量结构变量a a.a.birthdatebirthdate.year.yeara.a.birthdatebirthdate.month.montha.a.birthdatebirthdate.day.daya.scorea.scorea.addressa.address2字节字节10字节字节6字节字节4字节字节30字节字节52字节字节&a=&a.num8.1.2 结构变量结构变量 注意:注意: (1 1) 结构结构 类型与类型与结构

9、结构变量是不同的概念变量是不同的概念; (2 2)结构体成员的使用与普通变量相同,可单独使用)结构体成员的使用与普通变量相同,可单独使用; (3 3)成员名可以与程序变量名相同,但二者代表不同)成员名可以与程序变量名相同,但二者代表不同对象对象 int num; int num; struct student int num;.; struct student int num;.; (4 4)嵌套的数据成员,只有到最后一层才能进行各种)嵌套的数据成员,只有到最后一层才能进行各种操作操作8.1.3 结构数组结构数组 说明:说明: 存储类型存储类型 struct struct 结构类型名结构类型名

10、 结构数组名结构数组名 元素个数元素个数 ; struct student class970540;struct student class970540; 初始化:初始化: struct student class970540=,struct student class970540=,; 输入输出:输入输出: for(i=0;i40;i+)for(i=0;i-成员名成员名 pstu-numpstu-num . - . -同属第一优先级同属第一优先级 * *属第二优先级属第二优先级 初始化初始化 struct student struct student * *pstu=class9705;ps

11、tu=class9705; pstu+; pstu+; 相当于加一个结构类型的长度相当于加一个结构类型的长度8.1.5 结构体与函数结构体与函数 利用参数传递结构体利用参数传递结构体 结构变量在函数间的传递结构变量在函数间的传递n数据复制数据复制 单向传递,调用函数单向传递,调用函数-被调用函数被调用函数 形参为结构体变量,实参为结构体变量形参为结构体变量,实参为结构体变量n地址传递地址传递 双向传递双向传递n 形参为结构体指针,实参为地址形参为结构体指针,实参为地址n 表面上为数据复制,即形参和实参均为结构体变量,表面上为数据复制,即形参和实参均为结构体变量,但

12、结构体的成员为指针,则实际完成的地址传递但结构体的成员为指针,则实际完成的地址传递struct dataint a;int b;int c;struct dataint a;int b;int c;main()main() struct data arg; void func(struct data); struct data arg; void func(struct data); arg.a=27; arg.b=3; arg.c=arg.a+arg.b; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(“arg.a=%d, arg.b=%d,arg

13、.c=%dn”, arg.a, arg.b,arg.c); printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); printf(“CALL FUNC()n”); printf(“CALL FUNC()n”); func(arg); func(arg); printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); void func(struct dat

14、a parm)void func(struct data parm) printf(“parm.a=%d,parm.b=%d,parm.c=%dn”,parm.a,parg.b,parm.c); printf(“parm.a=%d,parm.b=%d,parm.c=%dn”,parm.a,parg.b,parm.c); printf(“PROCESSn”); printf(“PROCESSn”); parm.a=18, parm.b=5,parm.c=parm.a parm.a=18, parm.b=5,parm.c=parm.a* *parm.b;parm.b; printf(“parm.a

15、=%d,parm.b=%d,parm.c=%dn”,parm.a, arg.b,parm.c); printf(“parm.a=%d,parm.b=%d,parm.c=%dn”,parm.a, arg.b,parm.c); printf(“RETURNn”); printf(“RETURNn”); a: 27b: 3c: 30 argparma: 27b: 3c: 30arg.a=27,arg.b=3,arg.c=30arg.a=27,arg.b=3,arg.c=30CALL FUNC()CALL FUNC()parm.a=27,parm.b=3,parm.c=30parm.a=27,parm

16、.b=3,parm.c=30PROCESSPROCESSparm.a=18,parm.b=5,parm.c=90parm.a=18,parm.b=5,parm.c=90RETURN RETURN arg.a=27,arg.b=3,arg.c=30arg.a=27,arg.b=3,arg.c=30a: 18b: 5c: 90数据复制数据复制struct dataint a;int b;int c;struct dataint a;int b;int c;main()main() struct data arg; void func(struct data struct data arg; voi

17、d func(struct data * *);); arg.a=27; arg.b=3;arg.c=arg.a+arg.b; arg.a=27; arg.b=3;arg.c=arg.a+arg.b; printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); printf(“CALL FUNC()n”); printf(“CALL FUNC()n”); func( func(& &arg);arg)

18、; printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); printf(“arg.a=%d, arg.b=%d,arg.c=%dn”, arg.a, arg.b,arg.c); void func(struct data void func(struct data * *parm)parm) printf(“parm-a=%d,parm-b=%d,parm-c=%dn”,parm-a,parg-b,parm- printf(“parm-a=%d,parm-b=%d,parm-c=%dn”,parm-a,parg-b,parm-c

19、);c); printf(“PROCESSn”); printf(“PROCESSn”); parm-a=18, parm-b=5, parm-c=parm-a parm-a=18, parm-b=5, parm-c=parm-a* *parm-b;parm-b; printf(“parm-a=%d,parm-b=%d,parm-c=%dn”,parm-a,parg-b,parm- printf(“parm-a=%d,parm-b=%d,parm-c=%dn”,parm-a,parg-b,parm-c);c); printf(“RETURNn”); printf(“RETURNn”); a:

20、27b: 3c: 30 argparm2000a: 18b: 5c: 90地址传递(地址传递(1)arg.a=27,arg.b=3,arg.c=30arg.a=27,arg.b=3,arg.c=30CALL FUNC()CALL FUNC()parm-a=27,parm.b-3,parm-c=30parm-a=27,parm.b-3,parm-c=30PROCESSPROCESSparm-a=18,parm-b=5,parm-c=90parm-a=18,parm-b=5,parm-c=90RETURN RETURN arg.a=18,arg.b=5,arg.c=90arg.a=18,arg.b

21、=5,arg.c=90struct data int struct data int * *a;int a;int * *b;int b;int * *c;c;main()main() struct data arg; void func(struct data); int x,y,z; struct data arg; void func(struct data); int x,y,z; arg.a=&x, arg.a=&x,* *arg.a=27;arg.b=&y,arg.a=27;arg.b=&y,* *arg.b=3;arg.c=&z; arg.

22、b=3;arg.c=&z; * *arg.c=arg.c=* *arg.a+arg.a+* *arg.b;arg.b; printf(“ printf(“* *arg.a=%d,arg.a=%d,* *arg.b=%d,arg.b=%d,* *arg.c=%dn”, arg.c=%dn”, * *arg.a, arg.a, * *arg.b,arg.b,* *arg.c);arg.c); printf(“CALL FUNC()n”); printf(“CALL FUNC()n”); func(arg); func(arg); printf(“ printf(“* *arg.a=%d,a

23、rg.a=%d,* *arg.b=%d,arg.b=%d,* *arg.c=%dn”, arg.c=%dn”, * *arg.a, arg.a, * *arg.b,arg.b,* *arg.c);arg.c); void func(struct data parm)void func(struct data parm) printf(“printf(“* *parm.a=%d,parm.a=%d,* *parm.b=%d,parm.b=%d,* *parm.c=%dn”,parm.c=%dn”,* *parm.a,parm.a,* *parg.b,parg.b,* *parm.parm.c);

24、c); printf(“PROCESSn”); printf(“PROCESSn”); * *parm.a=18, parm.a=18, * *parm.b=5, parm.b=5, * *parm.c=parm.c=* *parm.aparm.a* * *parm.b;parm.b; printf(“printf(“* *parm.a=%d,parm.a=%d,* *parm.b=%d,parm.b=%d,* *parm.c=%dn”,parm.c=%dn”,* *parm.a,parm.a,* *parg.b,parg.b,* *parm.parm.c);c); printf(“RETUR

25、Nn”); printf(“RETURNn”); x: 27y: 3z: 30 argparma:2000b:2002c:2004* *arg.a=27,arg.a=27,* *arg.b=3,arg.b=3,* *arg.c=30arg.c=30CALL FUNC()CALL FUNC()* *parm.a=27,parm.a=27,* *parm.b=3,parm.b=3,* *parm.c=30parm.c=30PROCESSPROCESS* *parm.a=18,parm.a=18,* *parm.b=5,parm.b=5,* *parm.c=90parm.c=90RETURN RET

26、URN * *arg.a=18,arg.a=18,* *arg.b=5,arg.b=5,* *arg.c=90arg.c=90 x: 18y: 5z: 90地址传递(地址传递(2)a:2000b:2002c:20048.1.5 结构体与函数结构体与函数 2 2、 结构数组在函数间的传递结构数组在函数间的传递数据复制数据复制双向传递双向传递形参为结构指针或结构数组,实参为地址形参为结构指针或结构数组,实参为地址stuq2000stu0stu1stu398.1.5 结构体与函数结构体与函数四四十十个学生,要求找出成绩最高者的姓名和成绩个学生,要求找出成绩最高者的姓名和成绩struct studen

27、t int num; char name12; float score; struct student int num; char name12; float score; ;main()main() struct student stu40, struct student stu40,* *p; int i, max(struct student p; int i, max(struct student * *,int);,int); for(i=0;i40;i+) for(i=0;iscore; int i,m=0; float s=q-score; int i,m=0; for(q+,i

28、=1;in;i+,q+) for(q+,i=1;iscores) s=q-score; m=i; if(q-scores) s=q-score; m=i; return(m); return(m); 结构数组的传递结构数组的传递求某班学生的平均成绩求某班学生的平均成绩struct student int num; char name20; float score; ;struct student int num; char name20; float score; ;main()main() struct student class40; struct student class40; int

29、 i; int i; float avg,average(struct student float avg,average(struct student * *, int);, int); for(i=0;i40;i+) for(i=0;i40;i+) scanf(“%d%s%f”,&classi.num, ,&classi.score); scanf(“%d%s%f”,&classi.num, ,&classi.score); avg=average(class,40); avg=average(class,40);

30、 printf(“average score is: %fn”, avg); printf(“average score is: %fn”, avg); float average(struct student float average(struct student * *p,int n)p,int n) int i; float a=0; int i; float a=0; for(i=0;iscore; for(i=0;iscore; a/=n; a/=n; return(a); return(a); 8.1.5 结构体与函数结构体与函数结构数组的传递结构数组的传递for(i=0;in;

31、i+) a+=(for(i=0;iscore; a+=(p+i)-score; * */ /8.1.5 结构体与函数结构体与函数 结构型函数与结构指针型函数结构型函数与结构指针型函数 返回值为结构类型(结构变量或结构指针)返回值为结构类型(结构变量或结构指针) 说明:说明: struct struct 结构体名结构体名 函数名(形式参数)函数名(形式参数) struct struct 结构体名结构体名 * *函数名(形式参数)函数名(形式参数) 注意:注意:四个学生,要求找出成绩最高者的姓名和成绩四个学生,要求找出成绩最高者的姓名和成绩#include #inc

32、lude struct student int num; char name12; float score; struct student int num; char name12; float score; ;main()main() struct student stu40, max(struct student struct student stu40, max(struct student * *,int),p; int i; ,int),p; int i; for(i=0;i40;i+) for(i=0;inum; strcpy(,q-name); m.score=q-s

33、core; m.num=q-num; strcpy(,q-name); m.score=q-score; for(q+,i=1;in;i+,q+) for(q+,i=1;iscorem.score) if(q-scorem.score) m.num=q-num; strcpy(,q-name); m.score=q-score; m.num=q-num; strcpy(,q-name); m.score=q-score; return(m); return(m); 8.1.5 结构体与函数结构体与函数结构型函数结构型函数8.1.5 结构体与函数结构体与函数四

34、个学生,要求找出成绩最高者的姓名和成绩四个学生,要求找出成绩最高者的姓名和成绩struct student int num; char name12; float score; struct student int num; char name12; float score; ;main()main() struct student stu40, struct student stu40, * * max(struct student max(struct student * *,int),int),* *p; int i; p; int i; for(i=0;i40;i+) for(i=0;

35、inum,p-name,p-score); printf(No:%dnname:%snscore:%fn,p-num,p-name,p-score); struct student struct student * *max(struct student max(struct student * *q,int n)q,int n) struct student struct student * *m=q; int i;m=q; int i; for(q+,i=1;in;i+,q+) for(q+,i=1;iscorem-score) m=q; if(q-scorem-score) m=q; r

36、eturn(m); return(m); 结构指针型函数结构指针型函数8-2 联合体联合体 格式:格式:union union 联合类型名联合类型名 成员列表;成员列表; 联合变量名联合变量名 ; union union 联合类型名联合类型名 联合变量名;联合变量名;同结构体一样,联合体也是由不同数据类型的数据元素同结构体一样,联合体也是由不同数据类型的数据元素(成员)组成,但其占有内存的方式不同。(成员)组成,但其占有内存的方式不同。结构体变量所占内存长度是各成员所占的长度之结构体变量所占内存长度是各成员所占的长度之和和,各成,各成员分别占有自己的内存单元。员分别占有自己的内存单元。联合体变

37、量所占内存长度等于联合体变量所占内存长度等于最长最长的成员长度。联合使用的成员长度。联合使用覆盖技术,使不同成员占用同一段存储区域。覆盖技术,使不同成员占用同一段存储区域。&a=&a.c15字节字节结构与联合存储模式的差异结构与联合存储模式的差异struct struct char c; char c; int i; int i; float f; float f; double d; double d; a; a;union union char c; char c; int i; int i; float f; float f; double d; double d; b;

38、 b;a a c ci if fd d1248b b c ci if fd d12848字节字节&b=&b.c=&b.i=&b.f= &b.d8-2 联合体联合体 特点:特点:(1 1)每一时刻,只有一个成员起作用,只能保持某)每一时刻,只有一个成员起作用,只能保持某个成员项的数据个成员项的数据(2 2)联合变量起作用的成员是最后一次存放的成员)联合变量起作用的成员是最后一次存放的成员(3 3)联合变量的地址和其各成员地址是同一地址)联合变量的地址和其各成员地址是同一地址(4 4)不能在定义联合变量时初始化)不能在定义联合变量时初始化(5 5)不能把联合

39、变量作为函数参数和返回值,但可)不能把联合变量作为函数参数和返回值,但可以使用联合指针以使用联合指针(6 6)联合可以嵌套,其成员亦可以是结构或数组)联合可以嵌套,其成员亦可以是结构或数组8-2 联合体联合体structstruct int num; int num; char name12; char name12; char sex; char sex; union int class; union int class; char position10; char position10; category; category;person;person;sizeof(person)=25s

40、izeof(person)=258-3 枚举枚举 功能:枚举功能:枚举-将变量的值一一列举出来将变量的值一一列举出来如果一个变量只有几种可能的值,可以定义为枚举如果一个变量只有几种可能的值,可以定义为枚举类型。类型。 格式:格式:enumenum 枚举类型名枚举类型名 枚举元素列表枚举元素列表 ; 定义定义enumenum 枚举类型名枚举类型名 枚举变量;枚举变量; 说明说明 例子:例子:enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday workdayen

41、um weekday workday,weekend;weekend;8-3 枚举枚举n说明:说明:(1 1)枚举元素不是变量,不能赋值,按常量处理)枚举元素不是变量,不能赋值,按常量处理(2 2)枚举元素是有值的,按定义时顺序值为)枚举元素是有值的,按定义时顺序值为0 0,1 1,22 可指定枚举元素的值,其后为前值增可指定枚举元素的值,其后为前值增1 1 若若enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday sun,mon,tue,wed,thu,fri,sat; 则则sun=0sun=0,mon=1,tue=2mon=1,tue=

42、2 若若enum weekday sun=7,mon,tue,wed,thu,fri,sat;enum weekday sun=7,mon,tue,wed,thu,fri,sat; 则则sun=7sun=7,mon=8,tue=9mon=8,tue=9 所以所以enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;(3 3)枚举值可用来判断)枚举值可用来判断 if(workdaysun) if(workdaysun) 顺序号顺序号(4 4)一个整数不能直接赋值给枚举变量

43、)一个整数不能直接赋值给枚举变量 workday=2;workday=2; - workday=(enum weekday)2; - workday=(enum weekday)2;main()main() enum color red,white,blue,green,black; enum color red,white,blue,green,black; enum color i,j,present; enum color i,j,present; for(i=red;i=black;i+) for(i=red;i=black;i+) for(j=red;j=black;j+) for(j=red;j=black

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论