第10章结构体、枚举和共用体类型.ppt
《第10章结构体、枚举和共用体类型.ppt》由会员分享,可在线阅读,更多相关《第10章结构体、枚举和共用体类型.ppt(72页珍藏版)》请在三一办公上搜索。
1、第8章 结构体、枚举和共用体类型,10.1 结构体类型10.2结构体和函数10.3 动态数据结构链表10.4枚举类型10.5共用体类型10.6 用户自定义类型,10.1 结构体类型,结构体类型的定义结构体类型中可以根据需要包含若干相同或不同类型的成员,这些成员所代表的信息必须是相关的信息。结构体类型定义的格式为:struct 结构体名类型名 成员名1;类型名 成员名2;类型名 成员名n;;例如,struct date int year;int month;int day;,10.1 结构体类型,struct studentint number;/*学号*/char name8;/*姓名*/ch
2、ar sex;/*性别*/float score4;/*成绩*/;struct是结构体类型的标识,是关键字。struct和后面的结构体名共同构成结构体类型名。结构体名应符合标识符的命名规则。结构体所有成员的定义用花括弧括起来。结构体成员的定义方式和变量的定义方式一样,成员类型可以是基本类型的,也可以是构造类型的。各成员之间用分号分隔。结构体内的各个成员名不能重名,但成员名可以与结构体外其他标识符同名,并不产生冲突。,10.1 结构体类型,结构体变量的定义用已经定义的结构体类型定义结构体变量。struct student stu;定义结构体类型的同时定义结构体变量。stu1,stu2。struc
3、t student int number;/*学号*/char name8;/*姓名*/char sex;/*性别*/float score4;/*成绩*/stu1,stu2;,10.1 结构体类型,定义无名结构体类型的同时定义结构体变量。这种定义形式省略了结构体名。不再需要定义此种类型变量的情况才可采用这种方式。struct int number;/*学号*/char name8;/*姓名*/char sex;/*性别*/float score4;/*成绩*/stu结构体变量各个成员按照定义的顺序依次占用连续的空间。可以定义指针变量指向结构体类型变量。结构体变量的地址虽与其第一个成员的地址的
4、值是相同的,但它们的类型是不同的。它们之间不能直接相互赋值,但是可以先将其用强制类型转换,转换为同一类型指针后相互赋值。,10.1 结构体类型,结构体变量的初始化和引用结构体变量的初始化若在定义之后进行初始化操作,只能对每个成员单独进行赋值。若在定义变量的同时进行初始化,则用一对花括弧括起各个成员值的列表并用赋值号和变量连接,成员值之间逗号分隔,具体格式为:结构体类型名 结构体变量=成员值列表;例如,struct student stu=1001,wang,f,60.5,80,75,90;结构体变量的引用只能引用结构体变量的成员,不能引用整个结构体变量。结构体变量的成员引用形式为:结构体变量名
5、.成员名其中“.”称为成员运算符。如果是通过指向结构体变量的指针引用结构体成员,形式为:(*指针变量名).成员名 或 指针变量名-成员名,10.1 结构体类型,如果结构体的成员仍然是构造类型,则需要逐级引用,直至最低级的成员,即只能对结构体变量最低级的成员进行存取和运算。【例10.1】输入学生的各项信息,计算总分和平均成绩后输出。#include stdio.hstruct dateint year;int month;int day;/*定义结构体类型struct date*/struct studentint number;/*学号*/char name10;/*姓名*/struct da
6、te birthday;/*生日,struct date类型*/,10.1 结构体类型,float score4;/*四门课成绩*/float total;/*总分*/float ave;/*平均成绩*/;/*定义结构体类型struct student*/main()struct student stu,*p;int k;printf(please enter number,10.1 结构体类型,for(stu.total=0,k=0;knumber);printf(name:%sn,p-name);printf(birthday:%d,%d,%dn,(*p).birthday.year,(*
7、p).birthday.month,(*p).birthday.day);printf(score:);for(k=0;kscorek);printf(ntotal:%6.2f n,stu.total);,10.1 结构体类型,printf(average:%6.2f n,stu.ave);某次程序运行结果为:please enter number&name:1002 liplease enter birthday(year,month,day):1975 6 8please enter the score(4):80 78.5 92 83.5number:1002name:libirthda
8、y:1975,6,8score:80.00 78.50 92.00 83.50total:334.00average:83.50,10.1 结构体类型,结构体数组结构体数组的定义、初始化若数组元素的类型为结构体类型,数组为结构体数组。定义结构体数组的同时也可对数组进行初始化操作。例如,struct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/stu3=461,liu,80,78,67,80,0,0,032,geng,98,78,86,90
9、,0,0,103,qian,79,89,68,80,0,0;可以定义指向结构体数组元素的指针变量,然后通过指针对数组元素操作。,10.1 结构体类型,结构体数组的引用结构体数组元素也是通过数组名和下标来引用,但要注意只能对最低级的成员进行存取和运算。引用的一般形式为:数组名下标.成员名例如,stu1.number、stu0.score2、stu2.ave通过指针引用结构体数组元素的形式和通过指针引用结构变量形式一样,为:(*指针变量名).成员名 或 指针变量名-成员名 例如,语句“p=,10.1 结构体类型,【例10.2】计算某班期末考试中所有学生的总分和平均成绩。#define N 50#i
10、nclude stdio.hstruct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/;main()struct student stuN,*p;int i,k;for(i=0,p=stu;pstu+N;p+,i+)/*输入学生的信息*/printf(the%d studentn,i);printf(number,10.1 结构体类型,scanf(%d%s,10.2结构体和函数,结构体变量的成员作为函数参数结构体变量的成员可作为函数的实际
11、参数,但是不适合作函数的形式参数。结构体变量的成员作函数实参的用法与普通变量作函数实参的用法相同,形参与实参之间仍然是“值传递”的方式。【例10.3】重新编写例10.2。#define N 50#include stdio.hstruct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/;,10.2结构体和函数,float total(float s,int n)/*计算总成绩*/int k;float sum=0;for(k=0;kn;k+
12、)sum+=sk;return(sum);float average(float x,int n)return(x/n);/*返回平均值*/main()struct student stuN;int i,k;for(i=0;iN;i+)/*输入学生的信息*/printf(the%d studentn,i);printf(number,10.2结构体和函数,scanf(%d%s,10.2结构体和函数,结构体指针变量作为函数参数允许函数之间传递结构体变量,若形参是结构体变量,那么实参也应是同类型的结构体。被调用函数对形参结构体变量的修改不能传递给实参。形参结构体变量占用内存空间、接收实参数据带来空
13、间和时间的巨大开销。因此语法上虽然允许,但一般很少采用这种方式。若向函数传递结构体变量的地址,则可以通过指针对实参结构体变量的空间操作,从而改变实参的值。参数传递时只需传递一个地址,空间和时间的代价都很小。一般采用结构体指针作为函数参数,而不采用结构体变量作为函数参数。,10.2结构体和函数,【例10.4】重新编写例10.3。#define N 50#include stdio.hstruct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/
14、;void input(struct student*stu)/*输入学生信息*/int k;printf(number,10.2结构体和函数,for(k=0;kscorek);void total_average(struct student*stu)/*计算总成绩和平均值*/int k;stu-total=0;for(k=0;ktotal+=stu-scorek;stu-ave=stu-total/4;void output(struct student*stu)/*输出学生信息*/int k;printf(number:%6dn,stu-number);printf(name:%sn,s
15、tu-name);printf(score:);,10.2结构体和函数,for(k=0;kscorek);printf(ntotal=%10.2f average=%10.2f n,stu-total,stu-ave);main()struct student stuN,*p;int i;for(i=0;iN;i+)/*输入学生的信息*/printf(the%d studentn,i);input(,10.2结构体和函数,结构体数组作函数参数向函数传递结构体数组实际也是传递数组的首地址。形参数组与实参数组使用共同的内存单元。函数形参、实数是同类型的结构体数组名或结构体指针。【例10.5】重新编
16、写例10.4。#define N 50#include stdio.hstruct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/;,10.2结构体和函数,void input(struct student stu,int n)/*输入学生的信息*/int i,k;for(i=0;in;i+)printf(the%d studentn,i);printf(number,10.2结构体和函数,for(;stutotal=0;for(k=0;k
17、total+=stu-scorek;stu-ave=stu-total/4;void output(struct student*stu,int n)/*输出处理后的学生信息*/int k,i;for(i=0;inumber);printf(name:%sn,(stu+i)-name);printf(score:);,10.2结构体和函数,for(k=0;kscorek);printf(ntotal=%10.2f average=%10.2f n,(stu+i)-total,(stu+i)-ave);main()struct student stuN;struct student*q=stu;
18、input(q,N);total_average(stu,N);output(stu,N);,10.3 动态数据结构链表,内存空间的动态分配和释放free函数free函数的的格式:void free(void*p);free函数的功能:释放指针变量p所指向的内存区,该函数没有返回值。一般p的值是调用malloc函数或calloc函数的返回值。malloc函数malloc函数的格式:void*malloc(unsigned int size);malloc函数的功能:在内存的动态存储区中分配size个字节的连续空间,并返回分配空间的起始地址。若分配失败,则返回空指针。注意:malloc函数的返回
19、值一般是空类型的指针(有的编译系统将其处理成char类型的指针)。使用该函数时通常需要用强制类型转换,将其转换为所需要的类型。,10.3 动态数据结构链表,【例10.6】注意内存空间的分配和释放。main()double*pointer;pointer=(double*)malloc(sizeof(double);/*申请一个double类型变量所需内存空间*/*pointer=8.234;printf(“%6.4fn”,*pointer);*pointer=*pointer+10;printf(%7.4fn,*pointer);*pointer=*pointer/2;printf(%6.4f
20、,*pointer);free(pointer);/*释放空间*/,10.3 动态数据结构链表,程序运行结果为:8.234018.23409.1170calloc函数calloc函数的的格式:void*calloc(unsigned int n,unsigned int size);calloc函数的功能:分配内存的动态存储区中n个长度为size个字节的连续空间,并返回分配空间的起始地址。若分配失败,则返回一个空指针。对calloc的返回值同样也可进行强制类型转换后使用。注意:calloc函数常用来为一维数组分配空间,其中n表示数组的长度,size表示数组元素所占字节数。这种方式获得的数组一般
21、称为动态数组。,10.3 动态数据结构链表,【例10.7】注意内存空间的分配和释放。main()int*a,i;a=(int*)calloc(5,sizeof(int);/*申请5个整型变量所需内存空间*/for(i=0;i5;i+)*(a+i)=i+1;for(i=0;i5;i+)printf(%4d,*(a+i);free(a);/*释放空间*/程序运行结果为:1 2 3 4 5,10.3 动态数据结构链表,链表链表由若干个结点构成。一个结点就是一个结构类型的变量。链表的每个结点需要占用连续内存空间,但是整个链表无须占用连续空间。因此,结点成员应该包括两部分:一部分存放实际需要的数据信息,
22、称为数据域;一部分存放指针,用来链接各个结点,称为链接域或指针域。在链表中,一个结点后面相邻的结点称为该结点的后继结点,该结点则称为其后继结点的前驱结点。单链表:结点指针域只包含一个后继结点地址的链表。用一个指针变量保存单链表的首地址,即第一个结点的地址,这个指针变量被称为头指针。头指针是一个链表的标志。注意:在链表的定义中,指向前驱结点或后继结点的指针的基类型是结点自身类型。,【例10.8】通过给结点的指针域赋值建立一个单链表。#include stdio.hstruct node char c;struct node*next;main()struct node*n1,*n2,*n3,*h
23、ead,*p;/*申请三个结点空间*/n1=(struct node*)malloc(sizeof(struct node);n2=(struct node*)malloc(sizeof(struct node);n3=(struct node*)malloc(sizeof(struct node);/*建立链表*/head=n1;,10.3 动态数据结构链表,10.3 动态数据结构链表,n1-c=A;n1-next=n2;n2-c=B;n2-next=n3;n3-c=C;n3-next=NULL;for(p=head;p!=NULL;p=p-next)printf(%3c,p-c);,10.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 结构 枚举 共用 类型
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5889024.html