【例6.7】下面是求最大值函数,主函数中初始化“c=0”是否是必需的?这个程序是否能完成预定功能?
#include <stdio.h> void max (double ,double ,double ); int main ( ) { double x , y ,c=0 ; scanf ( "%lf %lf" , &x , &y ); max (x ,y ,c ); x=2* (x+y )-c ; printf ("x=%lf\n" ,x ); max (x ,c ,c ); printf ("c=%lf\n" ,c ); return 0 ; } void max ( double a , double b ,double c ) { if (a>b ) c=a ; else c=b ; }
【解答】是必需的。如果不给它初始值,编译系统在编译scanf语句时,只会通过键盘给变量x和y赋值。在扫描到函数调用时,max的参数c没有赋值,就会给出警告信息。当然,第2次扫描时,能产生正确的执行文件。但产生警告信息,总不是件好事情。
设计的max函数是将最大值赋给变量c,但c是传值形式,在max函数内,它是最大值。一旦离开max函数,就恢复为原来的c值。
因为x和y都需要继续使用,不能改变它们的值,所以只能设计第3个参数返回最大值。这时需要采用传地址值的方式。修改后的程序如下所示:
#include <stdio.h> void max (double ,double ,double * ); int main ( ) { double x , y ,c=0 ; scanf ( "%lf %lf" , &x , &y ); max (x ,y ,&c ); x=2* (x+y )-c ; printf ("x=%lf\n" ,x ); max (x ,c ,&c ); printf ("c=%lf\n" ,c ); return 0 ; } void max ( double a , double b ,double *c ) { if (a>b ) *c=a ; else *c=b ; }
运行示范如下:
2.5 -3.2 x=-3.900000 c=2.500000
注意到主程序并不需要声明指针,直接使用“&c”传递就可以了。有人喜欢一定要一一对应,认为声明的参数是指针类型,一定要转化一个指针参数,即使用一个
double *p=&c ;
定义的指针,然后使用max(x,y,p)才能放心,其实是多余的。p是地址,&c也是地址,而且是同一个地址。下面的主程序演示分别使用这两种方法的例子。
#include <stdio.h> void max (double ,double ,double * ); int main ( ) { double x , y ,c=0 ,*p=&c ; scanf ( "%lf %lf" , &x , &y ); max (x ,y ,&c ); // 使用c 的地址 x=2* (x+y )-c ; printf ("x=%lf\n" ,x ); max (x ,c ,p ); // 使用指向c 的指针 printf ("c=%lf\n" ,c ); return 0 ; }
结论:不要教条!