《高级语言程序设计(c)12结构体和共用体.ppt》由会员分享,可在线阅读,更多相关《高级语言程序设计(c)12结构体和共用体.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、结构体和共用体结构体和共用体 1梁春燕华电信息管理教研室主要内容主要内容l结构体变量的定义l结构体变量的引用l结构体变量的初始化l结构体数组l结构体和指针l小结l上机作业 11结构体结构体&结构体是一种构造数据类型&用途:把不同类型的数据组合成一个整体-自定义数据类型l结构体类型定义struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体分号不能省例 struct student int num;char name20;char sex;int age;float score;char addr30
2、;namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节.结构体类型定义描述结构的组织形式,不分配内存结构体类型定义的作用域例子图解例子图解l先定义结构体类型,再定义结构体变量l一般形式:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;结构体变量的定义结构体变量的定义形式:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.变量名表列;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu
3、1,stu2;定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量形式:struct 类型标识符 成员名;类型标识符 成员名;.变量名表列;例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;用无名结构体直接定义变量只能一次直接定义结构体变量直接定义结构体变量 结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期说明:说明:l引用规则
4、l 结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名结构体变量的引用结构体变量的引用l形式一:struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;结构体变量的初
5、始化结构体变量的初始化struct 结构体名 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;结构体变量的初始化结构体变量的初始化形式二:形式二:struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wa
6、ng Lin”,M,19,“200 Beijing Road”;结构体变量的初始化结构体变量的初始化形式三:形式三:l结构体数组的定义三种形式:形式一:struct student int num;char name20;char sex;int age;struct student stu2;形式二:struct student int num;char name20;char sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu2;numnamesexagenumnamesexagestu0stu125B结
7、构体数组结构体数组例 struct int num;char name20;char sex;int age;stu=,;结构体数组引用引用方式:结构体数组名下标.成员名 struct student int num;char name20;char sex;int age;stu3;stu1.age+;strcpy(stu0.name,”ZhaoDa”);结构体数组初始化结构体数组初始化struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;f
8、or(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例 int n;int *p=&n;*p=10;n=10struct student stu1;struct student *p=&stu1;stu1.num=101;(*p).num=101结构体和指针结构体和指针l用结构体变量的成员作参数-值传递l用指向结构体变量或数组的指针作参数-地址传递l用结构体变
9、量作参数-多值传递,效率低用指向结构体的指针作函数参数用指向结构体的指针作函数参数struct data int a,b,c;main()void func(struct data);struct data arg;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(Call Func().n);func(arg);printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct
10、data parm)printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c);printf(Process.n);parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf(parm.a=%d parm.b=%d parm.c=%dn,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:
11、3c:30(main)arga:27b:3c:30(main)例例 用结构体变量作函数参数(用结构体变量作函数参数(1)struct data int a,b,c;main()void func(struct data *parm);struct data arg;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(Call Func().n);func(&arg);printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.
12、b,arg.c);void func(struct data *parm)printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c);printf(Process.n);parm-a=18;parm-b=5;parm-c=parm-a*parm-b;printf(parm-a=%d parm-b=%d parm-c=%dn,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)pa
13、rm*arga:18b:5c:90(main)(func)parm*例例 用结构体指针变量作函数参数(用结构体指针变量作函数参数(2)小结小结小结小结l结构体变量的定义、引用和初始化:lstruct l.成员操作符 l结构体数组的定义、引用和初始化;l指向结构体的指针的用法l-指向运算符上机作业上机作业上机作业上机作业11l试验目的l掌握结构体类型变量的定义和使用;l掌握结构体类型数组的概念和应用。上机作业上机作业11l试验内容l有5个学生,每个学生的数据包括学号、姓名、三门课的成绩;l编写五个子函数:l函数input,以表中的数据初始化5个学生的数据;l函数average,求出每个学生的平均分;l函数class_average,求出每门课的平均分;l函数max,求出平均分最高的学生;l函数class_max,求出每门课分数最高的学生.l 在主函数main中分别调用五个子函数,并输出五个学生的数据和平均分、三门课程的平均分、平均分最高和每门课分数最高的学生数据。numnameclass1class2class3001Li Ming87.0094.0079.00002Chen Fei68.0089.0082.00003Sun Jie78.0090.0074.00004He Wei69.0070.0062.00005Liu Li84.0092.0081.00END
限制150内