结构体两种传参形式
题目:有一个结构体变量stu,内含学生学号、姓名、和3门课程的成绩。要求在函数add10中将小于60分的成绩增加10分,然后输出全部信息。
一、结构体变量作为实参
/* 2017年6月30日13:53:15 功能:结构体变量作为实参 */ #include <stdio.h> struct stu { int num; char name[10]; float score[3]; }; void add10(struct stu st2) { int i; for(i=0; i<3; i++) { if(st2.score[i]<60) st2.score[i] += 10; } printf("NO.%d Name:%s Score:%.2f, %.2f, %.2f ", st2.num, st2.name, st2.score[0],st2.score[1],st2.score[2]); } void main(void) { struct stu st1 = {13, "Mili", 99.50, 59.69, 58.80}; add10(st1); } /* 总结: 1.用结构体变量作实参时,采取的是“值传递”的方式。形参必须是同类型的结构体变量。 2.在函数调用期间,形参也要占用内在单元,系统将实参中各成员的值传递给形参的各个成员。 3.这种传递方式在空间和时间上开销较大。此外,由于采用值传递方式,实参向形参意向传递数据,实参能够影响形参,但形参的值不会影响实参。 在VC++6.0中执行结果: ------------------------- NO.13 Name:Mili Score:99.50, 69.69, 68.80 ------------------------- */
二-、结构体指针作为函数参数
/* 2017年6月30日13:54:29 功能:结构体指针作函数参数 */ #include <stdio.h> struct stu { int num; char name[10]; float score; }; void list(struct stu *p) { p->score+=0.31; printf("NO.:%d Name:%s Score:%.2f ", (*p).num, p->name, p->score); } void main(void) { struct stu st1 = {13, "Mili", 99.69}; list(&st1); printf("NO.%d Name:%s Score:%.2f ", st1.num, st1.name, st1.score); } /* 总结: 1.用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。这样形参值的改变会影响到实参的值。 2.在main函数中初奴化结构体变量st1,在list函数中改动其分数并显示其信息。看形参某个值的改变是否会影响到实参。 在VC++6.0中执行结果: ------------------------------------ NO.13 Name:Mili Score:100.00——在调用函数中显示的结果 NO.13 Name:Mili Score:100.00——在主函数中显示的结果 ------------------------------------ */