第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 student int number; /*学号*/
2、 char name8; /*姓名*/ char sex; /*性别*/ float score4; /*成绩*/ ; struct是结构体类型的标识,是关键字。struct和后面的结构体名共同构成结构体类型名。结构体名应符合标识符的命名规则。 结构体所有成员的定义用花括弧括起来。结构体成员的定义方式和变量的定义方式一样,成员类型可以是基本类型的,也可以是构造类型的。各成员之间用分号分隔。 结构体内的各个成员名不能重名,但成员名可以与结构体外其他标识符同名,并不产生冲突。,10.1 结构体类型,结构体变量的定义 用已经定义的结构体类型定义结构体变量。 struct student stu; 定
3、义结构体类型的同时定义结构体变量。stu1,stu2。 struct 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
5、,80,75,90; 结构体变量的引用 只能引用结构体变量的成员,不能引用整个结构体变量。结构体变量的成员引用形式为: 结构体变量名.成员名 其中“.”称为成员运算符。如果是通过指向结构体变量的指针引用结构体成员,形式为: (*指针变量名).成员名 或 指针变量名-成员名,10.1 结构体类型,如果结构体的成员仍然是构造类型,则需要逐级引用,直至最低级的成员,即只能对结构体变量最低级的成员进行存取和运算。 【例10.1】输入学生的各项信息,计算总分和平均成绩后输出。 #include “stdio.h“ struct date int year; int month; int day; ; /
6、*定义结构体类型struct date*/ struct student int number; /*学号*/ char name10; /*姓名*/ struct date 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 结构体类型,
7、for(stu.total=0,k=0;knumber); printf(“name :%sn“, p-name); printf(“birthday :%d,%d,%dn“, (*p).birthday.year, (*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 numb
8、er& name: 1002 li please enter birthday(year,month,day):1975 6 8 please enter the score(4):80 78.5 92 83.5 number :1002 name :li birthday :1975,6,8 score: 80.00 78.50 92.00 83.50 total:334.00 average: 83.50,10.1 结构体类型,结构体数组 结构体数组的定义、初始化 若数组元素的类型为结构体类型,数组为结构体数组。 定义结构体数组的同时也可对数组进行初始化操作。例如, struct stud
9、ent int number; /*学号*/ char name10; /*姓名*/ float score4; /*四门课程成绩*/ float total; /*总分*/ float ave; /*平均成绩*/ stu3= 461,“liu“,80,78,67,80,0,0,032,“geng“,98,78,86,90, 0,0, 103, “qian“,79,89,68,80,0,0 ; 可以定义指向结构体数组元素的指针变量,然后通过指针对数组元素操作。,10.1 结构体类型,结构体数组的引用 结构体数组元素也是通过数组名和下标来引用,但要注意只能对最低级的成员进行存取和运算。引用的一般
10、形式为: 数组名下标.成员名 例如,stu1.number 、stu0.score2、 stu2.ave 通过指针引用结构体数组元素的形式和通过指针引用结构变量形式一样,为: (*指针变量名).成员名 或 指针变量名-成员名 例如,语句“p=,10.1 结构体类型,【例10.2】计算某班期末考试中所有学生的总分和平均成绩。 #define N 50 #include “stdio.h“ struct student int number; /*学号*/ char name10; /*姓名*/ float score4; /*四门课程成绩*/ float total; /*总分*/ float
11、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结构体和函数,结构体变量的成员作为函数参数 结构体变量的成员可作为函数的实际参数,但是不适合作函数的形式参数。 结构体变量的成员作函数实参的用法与普通变量作函数实参的用法相同,形参与实参之间仍然是“值传递”的方式。 【例10.3】重新编写例10.2。
12、 #define N 50 #include “stdio.h“ struct student int 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+) sum+=sk; return(sum); float average( float x, int n ) return(x/
13、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结构体和函数,结构体指针变量作为函数参数 允许函数之间传递结构体变量,若形参是结构体变量,那么实参也应是同类型的结构体。被调用函数对形参结构体变量的修改不能传递给实参。形参结构体变量占用内存空间、接收实参数据带来空间和时间的巨大开销。因此语法上虽然允许,但一般很少采用这种方式。 若向函数
14、传递结构体变量的地址,则可以通过指针对实参结构体变量的空间操作,从而改变实参的值。参数传递时只需传递一个地址,空间和时间的代价都很小。 一般采用结构体指针作为函数参数,而不采用结构体变量作为函数参数。,10.2结构体和函数,【例10.4】重新编写例10.3。 #define N 50 #include “stdio.h“ struct student int number; /*学号*/ char name10; /*姓名*/ float score4; /*四门课程成绩*/ float total; /*总分*/ float ave; /*平均成绩*/ ; void input(struct
15、 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(“nam
16、e:%sn“, stu-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结构体和函数,结构体数组作函数参数 向函数传递结构体数组实际也是传递数组的首地址。形参数组与实参数组使用共同的内存单元。 函数形
17、参、实数是同类型的结构体数组名或结构体指针。 【例10.5】重新编写例10.4。 #define N 50 #include “stdio.h“ struct student int 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 student
18、n “,i); printf(“number,10.2结构体和函数,for(;stutotal=0; for(k=0;ktotal+= 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
19、.2f n“, (stu+i)-total, (stu+i) -ave); main( ) struct student stuN; struct student *q=stu; 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 *m
20、alloc(unsigned int size); malloc函数的功能:在内存的动态存储区中分配size个字节的连续空间,并返回分配空间的起始地址。若分配失败,则返回空指针。 注意:malloc函数的返回值一般是空类型的指针(有的编译系统将其处理成char类型的指针)。使用该函数时通常需要用强制类型转换,将其转换为所需要的类型。,10.3 动态数据结构链表,【例10.6】注意内存空间的分配和释放。 main( ) double *pointer; pointer=(double *)malloc(sizeof(double); /*申请一个double类型变量所需内存空间*/ *point
21、er=8.234; printf(“%6.4fn”,*pointer); *pointer=*pointer+10; printf(“%7.4fn“,*pointer); *pointer=*pointer/2; printf(“%6.4f“,*pointer); free(pointer); /*释放空间*/ ,10.3 动态数据结构链表,程序运行结果为: 8.2340 18.2340 9.1170 calloc函数 calloc函数的的格式: void *calloc(unsigned int n,unsigned int size); calloc函数的功能:分配内存的动态存储区中n个长
22、度为size个字节的连续空间,并返回分配空间的起始地址。若分配失败,则返回一个空指针。对calloc的返回值同样也可进行强制类型转换后使用。 注意:calloc函数常用来为一维数组分配空间,其中n表示数组的长度,size表示数组元素所占字节数。 这种方式获得的数组一般称为动态数组。,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“,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 结构 枚举 共用 类型
链接地址:https://www.31doc.com/p-2250730.html