序号 | 038 | 周 次 | 授课形式 | 新授 | |
授课章节名称 | |||||
教学目的 | 理解和使用结构体指针 | ||||
教学重点 | 理解和使用结构体指针 | ||||
教学难点 | 理解和使用结构体指针 | ||||
使用教具 | 机房 | ||||
课外作业 | |||||
课后体会 | |||||
授课主要内容 指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。 指针变量的基类型必须与结构体变量的类型相同。例如: struct Student *pt; 9.3.1 指向结构体变量的指针 例9.5 通过指向结构体变量的指针变量输出结构体变量中成员的信息。 解题思路:在已有的基础上,本题要解决两个问题: ◆怎样对结构体变量成员赋值; ◆怎样通过指向结构体变量的指针访问结构体变量中成员。 #include <stdio.h> #include <string.h> int main() { struct Student 长寿热线 { long num; char name[20]; char sex; float score; }; …… struct Student stu_1; struct Student * p; 贵州省公路局局长 p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”); stu_1.sex='M‘; stu_1.score=89.5; printf("No.:%ld\n”,stu_1.num); printf("name:%s\n",stu_1.name); printf("sex:%c\n”,stu_1.sex); printf(”score:%5.1f\n”,stu_1.score); return 0; } struct Student stu_1; struct Student * p; p=&stu_1; stu_1.num=10101; strcpy(stu_1.name,“Li Lin”); stu_1.sex='M‘; stu_1.score=89.5; printf("No.:%ld\n”,stu_1.num); printf("name:%s\n",stu_1.name); printf("sex:%c\n”,stu_1.sex); printf(”score:%5.1f\n”,stu_1.score); return 0; } 说明: ◆为了使用方便和直观,C语言允许把(*p).num用p->num来代替 ◆(*p).name等价于p->name ◆如果p指向一个结构体变量stu,以下等价: ① stu.成员名(如stu.num) ② (*p).成员名(如(*p).num) 康柏显示器 p->成员名(如p->num) 9.3.2 指向结构体数组的指针 例9.6 有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。 解题思路:用指向结构体变量的指针处理 (1)声明struct Student,并定义结构体数组、初始化 (2)定义指向struct Student类型指针p (3)使p指向数组首元素,输出元素中各信息 (4)使p指向下一个元素,输出元素中各信息 (5)再使p指向结构体数组的下一个元素,输出它指向的元素中的有关信息 #include <stdio.h> struct Student { int num; char name[20]; char sex; int age; }; struct Student stu[3]={ {10101,"Li Lin",'M',18}, {10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20} }; int main() { struct Student *p; printf(" No. Name sex age\n"); for(p=stu;p<stu+3;p++) printf(“%5d %-20s %2c %4d\n”, p->num, p->name, p->sex, p->age); return 0; } int main() { struct Student *p; printf(" No. Name sex age\n"); for(p=stu;p<stu+3;p++) printf(“%5d %-20s %2c %4d\n”, p->num, p->name, p->sex, p->age); return 0; } int main() { struct Student *p; printf(" No. Name sex age\n"); for(p=stu;p<stu+3;p++) printf(“%5d %-20s %2c %4d\n”, p->num, p->name, p->sex, p->age); return 0; } int main() { struct Student *p; printf(" No. Name sex age\n"); for(p=stu;p<stu+3;p++) printf(“%5d %-20s %2c %4d\n”, p->num, p->name, p->sex, p->age); return 0; }暗房易根经 9.3.3 用结构体变量和结构体变量的指针作函数参数 将一个结构体变量的值传递给另一个函数,有3个方法。 (1) 用结构体变量的成员作参数。 例如,用stu[1].num或stu[2].name作函数实参,将实参值传给形参。 ◆用法和用普通变量作实参是一样的,属于“值传递”方式。 ◆应当注意实参与形参的类型保持一致。 (2) 用结构体变量作实参。 ◆用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量 ◆在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大 ◆在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数 ◆一般较少用这种方法 (3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。 例9.7 有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。 解题思路:将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能: ◆用input函数输入数据和求各学生平均成绩 银针秀◆用max函数平均成绩最高的学生 ◆用print函数输出成绩最高学生的信息 ◆在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。最后得到结果。 ◆本程序假设n=3 #include <stdio.h> #define N 3 struct Student { int num; char name[20]; float score[3]; float aver; }; int main() { void input(struct Student stu[]); struct Student max(struct Student stu[]); void print(struct Student stu); struct Student stu[N],*p=stu; input(p); print(max(p)); return 0; } void input(struct Student stu[]) { int i; printf("请输入各学生的信息: 学号、姓名、三门课成绩电磁搅拌:\n"); for(i=0;i<N;i++) {scanf("%d %s %f %f %f", &stu[i].num,stu[i].name, &stu[i].score[0],&stu[i].score[1], &stu[i].score[2]); stu[i].aver=(stu[i].score[0]+ stu[i].score[1]+stu[i].score[2])/3.0; } } void input(struct Student stu[]) { int i; printf("请输入各学生的信息: 学号、姓名、三门课成绩:\n"); for(i=0;i<N;i++) {scanf("%d %s %f %f %f", &stu[i].num,stu[i].name, &stu[i].score[0],&stu[i].score[1], &stu[i].score[2]); stu[i].aver=(stu[i].score[0]+ stu[i].score[1]+stu[i].score[2])/3.0; } } void input(struct Student stu[]) { int i; printf("请输入各学生的信息: 学号、姓名、三门课成绩:\n"); for(i=0;i<N;i++) {scanf("%d %s %f %f %f", &stu[i].num,stu[i].name, &stu[i].score[0],&stu[i].score[1], &stu[i].score[2]); stu[i].aver=(stu[i].score[0]+ stu[i].score[1]+stu[i].score[2])/3.0; } } struct Student max(struct Student stu[]) {int i,m=0; for(i=0;i<N;i++) if (stu[i].aver>stu[m].aver) m=i; return stu[m]; } void print(struct Student stud) { printf("\n成绩最高的学生是:\n"); printf("学号:%d\n姓名:%s\n 三门课成绩:%5.1f,%5.1f,%5.1f\n 平均成绩:%6.2f\n”, stud.num, stud.name,stud.score[0], stud.score[1],stud.score[2],stud.aver); } 以上3个函数的调用,情况各不相同: ◆调用input函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。 ◆调用max函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。 ◆调用print函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。 | |||||
本文发布于:2024-09-23 20:20:52,感谢您对本站的认可!
本文链接:https://www.17tex.com/xueshu/361253.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |