1、1第9讲 结构体与指针、函数本讲内容:本讲内容:(1)结构体类型的指针变量结构体类型的指针变量(2)结构体与函数结构体与函数27.4.1 指向结构体变量的指针1.定义定义struct student char name20;int age;int s1,s2;stu=Mary,19,78,86;struct student *p;p=&stu;struct 结构体名结构体名*结构体变量名结构体变量名Mary197886stu2010203020342038p2010结构体的地址为结构体结构体的地址为结构体第一个成员的地址。第一个成员的地址。p=&stu.name;是否可以?是否可以?不可以,类
2、型不匹配。不可以,类型不匹配。p=(struct student*)&stu.name;改为:改为:37.4.1 指向结构体变量的指针2.成员的引用格式成员的引用格式(1)结构体变量名结构体变量名.成员名成员名 stu.age(2)(*指针变量名指针变量名).成员名成员名 (*p).age(3)指针变量名指针变量名-成员名成员名 p-age指向运算符指向运算符p-age+分析:分析:+p-age等价于等价于(p-age)+等价于等价于+(p-age)不等于不等于(+p)-agep-age类型?类型?不是指针类型不是指针类型struct student char name20;int age;i
3、nt s1,s2;struct student stu,*p;p=&stu;gets(stu.name);(*p).age=21;p-s1=87;p-s2=90;41.定义定义 struct student a3,*p;7.4.2 指向结构体数组的指针2.使用使用for(p=a;pname);scanf(%d%d%d,&p-age,&p-s1,&p-s2);赋初值为数组名赋初值为数组名p+表示使指针指向表示使指针指向下一个下一个结构体,而结构体,而不是下一个成员不是下一个成员Mary217886Alex209080Mike197568st0st1st2ppp57.4.2 指向结构体数组的指针思
4、考:思考:1.(+p)-age先使先使p加加1,然后的到,然后的到p-age的值的值先得到先得到p-age的值,然后使的值,然后使p加加12.(p+)-age3.+p-age4.p-age+先使先使p-age,然后的到,然后的到p-age的值的值先得到先得到p-age的值,然后使的值,然后使p-age加加161.函数实参和形参都用结构体变量函数实参和形参都用结构体变量,参数之间为参数之间为值传递值传递 实参结构体变量实参结构体变量各成员的值依次传给各成员的值依次传给形参结构体变量形参结构体变量7.5.1 结构体变量作为函数参数 struct student char name20;int ag
5、e;int s1,s2;void main()struct student stu=Alex,22,98,100;aaa(stu);printf(%d,stu.age);void aaa(struct student sss)sss.age=33;nameages1s2Alex2298100nameages1s2stusssAlex22981003377.5.1 结构体变量作为函数参数例例1 输入任意日期,计算该天是本年中第几天。使用函数计算输入任意日期,计算该天是本年中第几天。使用函数计算天数。天数。分析:分析:1.日期如何表示日期如何表示?定义日期结构体。定义日期结构体。struct da
6、te int year;int month;int day;2.函数如何设计函数如何设计?函数形参(输入):函数形参(输入):日期结构体变量日期结构体变量函数返回值(输出):函数返回值(输出):天数天数int fun(struct date d)函数原形:函数原形:87.5.1 结构体变量作为函数参数3.如何计算如何计算?如如 1999.2.1231 +12如如 1999.3.1331+28+13 如如 2000.3.1331+29+13 天数天数=前几个月份天数之和前几个月份天数之和+当月第几天当月第几天考虑闰年考虑闰年如何计算前几个月天数之和?如何计算前几个月天数之和?for(i=1;id
7、.month;i+)switch(i)case 1:case 3:case 5:case 7:case 8:case 10:case 12:t=31;break;case 4:case 6:case 9:case 11:t=30;break;case 2:if(d.year%4=0&d.year%100!=0|d.year%400=0)t=29;else t=28;days=days+t;97.5.1 结构体变量作为函数参数int fun(struct date d)int days=0,i,t;for(i=1;iage=33;Alex2298100stup100010201024102833
8、sss1000100012例例2 按成绩对学生信息进行从高到底的排序按成绩对学生信息进行从高到底的排序#include#define N 30struct stud int n;char name10;int s;7.5.2 结构体指针作为函数参数void sort(struct stud *p)int i,j;struct stud temp;for(i=0;iN-1;i+)for(j=i+1;js s)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;注意进行比较的是元素注意进行比较的是元素sti和和stj的的成绩成员成绩成员s,但但进行进行交换的是元素交换的是元
9、素sti和和stj13void main()int i;struct stud stN;for(i=0;iN;i+)scanf(%d%s%d,&sti.n,sti.name,&sti.s);sort(st);for(i=0;iN;i+)printf(%4d%10s%4d,sti.n,sti.name,sti.s);7.5.2 结构体指针作为函数参数/传递的结构体数组名传递的结构体数组名147.5.3 函数返回值为结构体类型格式:格式:结构体类型结构体类型 函数名(形参表)函数名(形参表)函数体;函数体;例例3 编写函数输入结构体变量,在主函数中输编写函数输入结构体变量,在主函数中输出出 struct student int num;char name20;float score;struct student input()struct student b;scanf(%d%s%f,&b.num,b.name,&b.score);return b;void main()struct student stu;stu=input();printf(%d,%s,%5.2fn,stu.num,stu.name,stu.score);15实验实验:实验:P99 实验实验1(3)