时先生必上岸 发表于 2020-11-24 11:34:48

函数形参与实参返回值的疑惑


#include <stdio.h>
void sub(double a, double *pb)
int main ()
{
    double x,y;
    scanf("%f%f",&x,&y);
    sub(x, &y);
    printf("x=%f y=%f\n",x,y);
}
void sub(double a,double *pb)
{
    a=a-*pb;
    *pb=*pb-a;
}
题目输入10.2 3.5<回车>,输出结果是x=10.200000 y=-3.200000
为什么函数值y改变了,而x没有改变。

jackz007 发表于 2020-11-24 11:58:52

   sub(double x , double * y) 这个函数的”长相”本来就是 x 不可变,* y 可变。

时先生必上岸 发表于 2020-11-24 12:23:38

jackz007 发表于 2020-11-24 11:58
sub(double x , double * y) 这个函数的”长相”本来就是 x 不可变,* y 可变。

能直白一点吗?

jackz007 发表于 2020-11-24 12:55:05

时先生必上岸 发表于 2020-11-24 12:23
能直白一点吗?

      y 传入函数的是变量地址,在 fun() 函数内只要向 * y 赋值,就可以改变调用参数的值。
      例如,假如在 main() 中有下面的语句:
      a = 5 ;
      b = 8 ;
      fun(a , & b) ;
      如果在 fun(double x , double * y) 中有
      x = 0 ;
      * y = 0 ;
         那么,在 main() 函数内,调用完 fun() 后,a = 5 ,b = 0。可见,a 依然维持原值,b 的值已经被修改为 0 值了。
      
         

风过无痕1989 发表于 2020-11-24 13:49:39

本帖最后由 风过无痕1989 于 2020-11-25 16:06 编辑

调用函数,不能直接将值传递过去(这就好比告诉你,有一个名叫 张山 的人,可是并没有告诉你,这个人的住址,你是找不到这个人的。或许长江路有叫张山的,黄河路上也有叫张山的,其他的城市也会有叫张山的),要传递值所在存贮区域的地址,这就是 10.2 没有改变,3.5 改变了的原因。
另外,你的程序有两个错误,已经帮你修改,看下面程序的注释
#include <stdio.h>
void sub(double a, double *pb);// 分号不可少
int main()
{
    double x,y;
    scanf("%lf%lf",&x,&y);      // 输入 double 型,控制符号经用:%lf
    sub(x, &y);                  // 将 x 、 & 作为函数的实际参数(简称:实参)
    printf("x = %f y = %f\n",x,y);
}
void sub(double a,double *pb)    // 以 double a 和 double *pb 的形式参数(简称:形参)接收主调函数传递过来的实参
{
    a = a - *pb;
    *pb = *pb - a;
}

时先生必上岸 发表于 2020-11-24 15:26:52

风过无痕1989 发表于 2020-11-24 13:49
调用函数,不能直接将值传递过去(这就好比告诉你,有一个名叫 张山 的人,可是并没有告诉你,这个人的住址 ...

那如果想要连a的值一同改变,是不是就需要将sub函数前的void改成想要的数据类型,再使用return返回函数的值?

风过无痕1989 发表于 2020-11-24 18:25:47

时先生必上岸 发表于 2020-11-24 15:26
那如果想要连a的值一同改变,是不是就需要将sub函数前的void改成想要的数据类型,再使用return返回函数的 ...

不用返回的,像 y 那样,将地传过去就行了

黎明gg 发表于 2020-11-25 11:25:42

不晓得我这么说你能不能理解,就是sub(x,&y)里面就是将x的值赋值给a,将y的地址赋值给*pb运算后*bp时-3.2,然后y的地址上的值就变为了这个值,而a只是将x值拿过来运算一下,并没有返回给x

时先生必上岸 发表于 2020-11-25 15:30:16

黎明gg 发表于 2020-11-25 11:25
不晓得我这么说你能不能理解,就是sub(x,&y)里面就是将x的值赋值给a,将y的地址赋值给*pb运算后*bp时-3. ...

我看明白你的解释了,就单纯的问一下我上面那么操作行不行。{:5_109:}

黎明gg 发表于 2020-11-26 13:06:34

时先生必上岸 发表于 2020-11-25 15:30
我看明白你的解释了,就单纯的问一下我上面那么操作行不行。

哦哦{:5_95:}{:5_95:}{:5_95:}
页: [1]
查看完整版本: 函数形参与实参返回值的疑惑