您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第08章结构体与共用体
西华大学电气信息学院郑海春1第八章结构体与共用体本章内容掌握结构体的概念和结构体类型的定义掌握结构体变量的定义和初始化掌握结构体成员的访问掌握结构体与指针、数组的关系了解动态内存的分配结合结构体的概念来认识共用体了解枚举类型西华大学电气信息学院郑海春28.1结构体8.2指向结构体变量的指针8.3结构体数组和指向结构体数组的指针8.4用结构体变量和指向结构体的指针作函数参数8.4动态分配存储单元8.5共用体8.6枚举类型8.7用typedef给类型取别名8.8习题本章目录西华大学电气信息学院郑海春38.1结构体为什么要用结构体C用数组存储许多相同类型和意义的相关信息,但是有些数据信息是由若干不同数据类型和不同意义的数据所组成。例如,一个学生记录包括学号、姓名、出生年月等,这些数据信息的类型是不一样的,不能用数组的形式把它们组织起来。用结构体变量就可有组织地把这些不同类型的数据信息存放在一起。否则程序需要定义若干个不同数据类型的变量来分别存储学生的相关信息,不便于程序管理。西华大学电气信息学院郑海春4结构体类型的定义结构体数据类型是一种非基本数据类型,需要由用户自己指定。一般格式:struct结构体名{结构体成员1定义;结构体成员2定义;…结构体成员n定义;};西华大学电气信息学院郑海春5例如学生信息包括:学号、姓名、性别、年龄、成绩和家庭住址项目。根据以上学生信息定义的结构体为:structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};说明:用户自己定义了一个新的名为student的结构体数据类型。注意:定义一个结构体仅仅是声明了一个新的数据类型,系统对结构体类型并不分配内存。西华大学电气信息学院郑海春6定义结构体类型变量的方法定义了结构体类型后就可以定义该类型的结构体变量形式1:先定义结构体类型,再定义结构体变量structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};…structstudents1,s2;西华大学电气信息学院郑海春7形式2:定义结构体类型的同时,定义结构体变量structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}s1,s2;西华大学电气信息学院郑海春8形式3:直接定义,但无结构体名,只有结构体变量名struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}s1,s2;西华大学电气信息学院郑海春9说明:结构体成员也可以是一个结构体类型变量。例如:structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];charsex;intage;structdatebirthday;floatscore;charaddr[30];}s1,s2;西华大学电气信息学院郑海春10结构体变量的引用⑴不能将一个结构体变量作为一个整体进行输入和输出。只能对结构体变量中的各个成员分别进行输入和输出。引用结构体变量中成员的方式为:结构体变量名.成员名例如:s1.num=10010;“.”是成员运算符。⑵对结构体变量的成员可以像普通变量一样进行各种运算。⑶如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。例如:s1.birthday.month=2;西华大学电气信息学院郑海春11结构体变量的初始化#includestdio.hstructstudent{longintnum;charname[20];charsex;charaddr[30];}s1={89031,LiLin,'M',123BeijingRoad};voidmain(){printf(NO.:%ld\nname:%s\nsex:%c\naddress:%s\n,s1.num,s1.name,s1.sex,s1.addr);}西华大学电气信息学院郑海春12结构体变量之间的直接赋值由于结构体大小确定、成员次序固定,所以,可以把一个结构体变量直接赋值给另一个同类型的结构体变量例如,接上例:structstudents2;s2=s1;西华大学电气信息学院郑海春138.2指向结构体变量的指针一个结构体变量的指针就是用一个指针变量来指向一个结构体变量在内存段中占据空间的起始地址。1.指向结构体变量的指针structstudents1;structstudent*p;p=&s1;s1.num=1010;(*p).name=“John”;2.指向结构体成员的运算符:-当一个指针p定义为某个结构体类型的指针后,该指针可以指向任何同类型的变量;并且可以通过指针间接访问结构体成员。例如,p-sex=‘F’;西华大学电气信息学院郑海春14s1.name(*p).namep-name等价,表示结构体变量s1的成员name的值西华大学电气信息学院郑海春158.3结构体数组和指向结构体数组的指针例1:结构体数组应用。对结构体数组中的人物信息按薪水由小到大的顺序排序并输出。#includestdio.hstructPerson{charname[20];unsignedlongid;floatsalary;};structPersonallone[6]={{john,10000,1339.5},{david,10001,1449.6},{marit,10002,1311.0},{jasen,10003,1623.2},{peter,10004,1400.0},{mike,10005,1511.0}};西华大学电气信息学院郑海春16voidmain(){structPersontemp;inti,j,k;for(i=1;i6;i++){/*按薪水从小到大排序*/for(j=0;j6-i;j++)/*一轮比较*/if(allone[j].salaryallone[j+1].salary)/*比较salary成员*/{temp=allone[j];/*结构变量的交换*/allone[j]=allone[j+1];allone[j+1]=temp;}}for(k=0;k6;k++)/*输出*/printf(%s%ld%.2f\n,allone[k].name,allone[k].id,allone[k].salary);}冒泡法西华大学电气信息学院郑海春17例2:结构体数组应用。对候选人得票的统计程序。有3个候选人,每次输入一个得票候选人的名字,要求最后输出各人得票结果。structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(%s,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(%5s:%d\n,leader[i].name,leader[i].count);}namecountLiZhangWang000西华大学电气信息学院郑海春18例3:指向结构体数组的指针的应用。西华大学电气信息学院郑海春198.4用结构体变量和指向结构体的指针作函数参数用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低西华大学电气信息学院郑海春20structdata{inta,b,c;};main(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%darg.b=%darg.c=%d\n,arg.a,arg.b,arg.c);printf(CallFunc()....\n);func(arg);printf(arg.a=%darg.b=%darg.c=%d\n,arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf(parm.a=%dparm.b=%dparm.c=%d\n,parm.a,parm.b,parm.c);printf(Process...\n);parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf(parm.a=%dparm.b=%dparm.c=%d\n,parm.a,parm.b,parm.c);printf(Return...\n);}arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用结构体变量作函数参数(1)西华大学电气信息学院郑海春21structdata{inta,b,c;};main(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%darg.b=%darg.c=%d\n,arg.a,arg.b,arg.c);printf(CallFunc()....\n);func(&arg);printf(arg.a=%darg.b=%darg.c=%d\n,arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf(parm-a=%dparm-b=%dparm-c=%d\n,parm-a,parm-b,parm-c);printf(Process...\n);parm-a=18;parm-b=5;parm-c=parm-a*parm-b;printf(parm-a=%dparm-b=%dparm-c=%d\n,parm-a,parm-b,parm-c);printf(Return...\n);}arga:18b:5c:90(main)arga:27b:3c:30(main)arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****例用结构体指针变量作函数参数(2)西华大学电气信息学院郑海春228.5动态分配存储单元动态分配存储单元是指在程序运行时(而不是在编译时),申请开辟某个大小的内存空间。由于动态内存的分配是在堆区进行,所以这种内存分配又叫堆内存的分配。C语言编译系统的库函数提供了相关的函数:1.malloc函数其函数原型为void*malloc(unsignedintsize);其作用是在内存的堆区中分配一个长度为size的连续空间。此函数的值(即返回值)是一个指向分配域起始地址的指针(其类型为void)。如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。西华大学电气信息学院郑海春232.calloc函数其函数原型为void*calloc(unsignedn,unsignedsize);其作用是在内存的堆区中分配n个长度为size的连续空间。函数返回一个指向分配域起始地址的指针;如果此函数未能成功地执行,则返回空指针(NULL)。用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。3.free函数其函数
本文标题:第08章结构体与共用体
链接地址:https://www.777doc.com/doc-3204229 .html