映月读书网 > C语言解惑 > 6.5 函数参数的设计及传递 >

6.5 函数参数的设计及传递

【例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
;
}
  

结论:不要教条!