您好,欢迎访问三七文档
1第11章结构体和共用体主讲北京交通大学计算机学院赵宏E-mail:zhaohong67@163.com第11章结构体与共用体2第一节结构体与共用体概述第二节结构体类型和结构体变量的定义第三节结构体类型变量的引用第四节结构体与数组第五节结构体与指针第六节结构体的应用--链表第七节共用体第八节使用typedef定义数据类型第11章结构体与共用体3第一节结构体与共用体概述结构体构造一个结构体类的数据类型的一般形式:struct结构类型名{类型标识符成员名;类型标识符成员名;:类型标识符成员名;};例:structstudent{charnumber[10];charname[20];charsex;intage;floatscore[20];charaddr[30];};第11章结构体与共用体5第二节结构体类型和结构体变量的定义定义结构体类数据类型变量的三种形式结构体类数据类型变量的初始化第11章结构体与共用体6形式一先构造结构体类的数据类型,后定义具有这种构造的变量。struct结构体类型名{类型标识符成员名;:类型标识符成员名;};struct结构体类型名变量名1,变量名2...;例如:structstudent{charnumber[10];charname[20];charsex;intage;floatscore[20];charaddr[30];};structstudentstud1,stud2;第11章结构体与共用体7在构造结构体类的数据类型时同时定义具有这种结构的变量。struct结构体类型名{类型标识符成员名;:类型标识符成员名;}变量名1,变量名2,...;形式二例如:structstudent{charnumber[10];charname[20];charsex;intage;floatscore[20];charaddr[30];}stud1,stud2;第11章结构体与共用体8利用无名结构体类型定义变量。struct{类型标识符成员名;:类型标识符成员名;}变量名1,变量名2,......;形式三例如:struct{charnumber[10];charname[20];charsex;intage;floatscore[20];charaddr[30];}stud1,stud2;第11章结构体与共用体9变量的初始化structstud{longnum;charname[20];charsex;charaddr[30];}stud1={9708,”Liwei,'F',144BeijingRoad”};第11章结构体与共用体10说明结构体的类型不分配存储单元,用结构体类数据类型定义的变量会分配存储空间;对结构体中的成员,可以单独使用,它的作用与地位相当于普通变量;一个结构体的成员名字不能相同,但两个结构体中可以使用同名成员,成员名也可以与程序中的变量名相同,二者代表不同的对象;成员也可以是一个结构体变量(嵌套)。第11章结构体与共用体11例如:structdate{intmonth;intday;intyear;};structstudent{charname[20];structdatebirthday;charsex;charaddr[30];longnumber;}stud;第11章结构体与共用体12第三节结构体类型变量的引用1、对结构体变量的使用是通过对数据类型为基本类型的成员的引用来实现的。引用结构体成员的一般形式如下:结构变量名.成员名例如stud1.age=18;其中的圆点符号称为成员运算符,它的运算级别最高。2、引用结构体类数据类型变量的成员的方式是由“整体到局部”来指明的。–若指明的结构体成员又是一个结构体类数据类型,则可以使用多个成员运算符,例如:stud.birthday.month=9;–若指明的成员是一个数组,则不能整体引用,但可以使用该成员的某个元素,如:stud.score[0]=65;第11章结构体与共用体133、用“&”运算符可以取结构体变量的首地址和某个成员的首地址。例如:printf(“%d\n”,&stud);scanf(“%c\n”,&stud.sex);scanf(“%d\n”,&stud.birthday.month);对数组成员的首地址,可以省略地址运算符,如:scanf(“%s”,stud.name);4、对成员变量可以象普通变量一样进行各种运算,例如:sum=stud.score[0]+stud.score[1]+stud.score[2]第11章结构体与共用体14结构体变量的输入和输出C语言不允许把一个结构体变量作为一个整体进行输入或输出的操作。例如:struct{longnum;charname[20];}stud;不允许scanf(%d,&stud);printf(%d,stud);可以用scanf(%ld%s,&stud.num,stud.name);printf(%ld,%s,stud.num,stud.name);第11章结构体与共用体15注意:1、由于结构体是由不同类型成员组成的,所以在用scanf函数输入不同类型数据时有时会出现预料不到的事情,例如:main(){struct{inti;charch1;charch2;}tt;scanf(“%d%c%c”,&tt.i,&tt.ch1,&tt.ch2);printf(“i=%d,ch1=%c,ch2=%c”,tt.i,tt.ch1,tt.ch2);}输入125ab运行结果?i=125,ch1=,ch2=a第11章结构体与共用体162、尽量避免用一个scanf函数输入包含字符数据在内的一组不同类型的数据,以免出错。处理办法:各种数据都用gets函数输入,然后再用转换函数进行转换:–atoi()将字符串转换成整型–atof()将字符串转换成double型实数–atol()将字符串转换成长整型这三个函数要用#include命令将“stdlib.h”文件包含进来。第11章结构体与共用体17输入示例1:#includestdlib.h#includestdio.hmain(){inti;charch,ch1,ch2;charnumstr[10];gets(numstr);i=atoi(numstr);ch1=getchar();ch=getchar();ch2=getchar();printf(i=%d,ch1=%c,ch2=%c\n,i,ch1,ch2);}程序运行结果如下:128abi=128,ch1=a,ch2=b第11章结构体与共用体18输入示例2:输入3个学生的信息并输出。#includestdlib.h#includestdio.hstructstud{longnum;charname[20];charsex;intage;floatscore;};第11章结构体与共用体19main(){structstudstudent[3];inti;charch;charnumstr[20];for(i=0;i3;i++){gets(numstr);student[i].num=atol(numstr);gets(student[i].name);student[i].sex=getchar();ch=getchar();gets(numstr);student[i].age=atoi(numstr);gets(numstr);student[i].score=atof(numstr);}for(i=0;i3;i++)printf(%ld%-15s%3c%6d%6.2f\n,student[i].num,student[i].name,student[i].sex,student[i].age,student[i].score);}第11章结构体与共用体20第四节结构体数组结构体数组的定义结构体数组的初始化结构体数组的引用第11章结构体与共用体21先定义结构体类型,再定义结构体数组。structstudent{longnum;charname[20];intage;floatscore;};structstudentstud[3];定义方法一第11章结构体与共用体24结构体数组在内存中的存储:(1)按数组下标由小到大(2)在给每个数组元素的空间内再按照成员的顺序连续存放。stud[0]9701,liMing,20,98stud[1]9702,WangDan,20,95stud[2]9703,LiHui,19,809701LiMing20989702WangDan20959703LiHui1980第11章结构体与共用体25初始化structstudent{longnum;charname[20];intage;floatscore;}stud[3]={{9701,liMing,20,98},{9702,WangDan,20,95},{9703,LiHui,19,80}};第11章结构体与共用体26引用引用某结构体数组元素的一个成员,可用以下形式:stud[i].num成员名序号数组名第11章结构体与共用体27说明不能将结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员为对象进行输入输出。例如:scanf(%s,stud[1].name);printf(%ld,%s,%d,%f,stud[1].numstud[1].name,stud[1].age,stud[1].score);第11章结构体与共用体28例1在N名毕业生中查找上海籍的学生。#defineN3struct{charname[20];charsex[3];intage;intscore;charaddr[30];}stud[N]={{“张利平”,“男”,23,79,“上海”},{“钱龙”,“女”,24,85,“南京”},{刘其山,男,22,66,上海}};main(){inti;for(i=0;iN;i++)if(strcmp(stud[i].addr,上海)==0)printf(%s%s%d%d%s\n,stud[i].name,stud[i].sex,stud[i].age,stud[i].score,stud[i].addr);}第11章结构体与共用体29指向结构体变量的指针变量指向结构体数组的指针变量处理结构体类数据的函数参数第五节结构体与指针第11章结构体与共用体30指向结构体变量的指针1、结构体变量的指针:结构体变量的起始地址。2、定义形式:struct结构类型名*变量名;例如:structstudent*p,stud;p=&stud;第11章结构体与共用体313、用此指针变量可间接访问它所指向的结构体类数据类型变量的各个成员。指针变量名-成员名例如:p-age=18;(*指针变量名).成员名例如:(*p).age=18第11章结构体与共用体32说明:–*p两册的括号不能省略,因为成员运算符“.”优于“*”运算符,*p.age等价于*(p.age)–p已定义为指向一个结构体类型的指针变量,它只能指向结构体变量而不能指向它其中的一个成员。如p=&stud1.age是错误的。–“-”运算符优先级别最高,例如:p-age+1等价于(p-age)+1++p-age等价于++(p-age)第11章结构体与共用体33例2:在三个学生中查找出成绩最好的学生并显示该学生的情况。structstudent{charname[20];charsex[3];intage;intscore;charaddr[30];};structstudentstud1={张利平,男,23,79,上海};structstudentstud2={钱龙,女,24,85,南京};structstudentstud3={刘其山,男,22,66,上海};main(){inti;structstud
本文标题:第六章多媒体数据库
链接地址:https://www.777doc.com/doc-1483562 .html