鱼C论坛

 找回密码
 立即注册
查看: 921|回复: 9

[已解决]函数形参与实参返回值的疑惑

[复制链接]
发表于 2020-11-24 11:34:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

#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没有改变。
最佳答案
2020-11-24 13:49:39
本帖最后由 风过无痕1989 于 2020-11-25 16:06 编辑

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-24 11:58:52 From FishC Mobile | 显示全部楼层
     sub(double x , double * y) 这个函数的”长相”本来就是 x 不可变,* y 可变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-24 12:23:38 | 显示全部楼层
jackz007 发表于 2020-11-24 11:58
sub(double x , double * y) 这个函数的”长相”本来就是 x 不可变,* y 可变。

能直白一点吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-24 12:55:05 From FishC Mobile | 显示全部楼层
时先生必上岸 发表于 2020-11-24 12:23
能直白一点吗?


      y 传入函数的是变量地址,在 fun() 函数内只要向 * y 赋值,就可以改变调用参数的值。
      例如,假如在 main() 中有下面的语句:
  1.         a = 5 ;
  2.         b = 8 ;
  3.         fun(a , & b) ;
复制代码

        如果在 fun(double x , double * y) 中有
  1.         x = 0 ;
  2.         * y = 0 ;
复制代码

         那么,在 main() 函数内,调用完 fun() 后,a = 5 ,b = 0。可见,a 依然维持原值,b 的值已经被修改为 0 值了。
        
         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-24 13:49:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-11-25 16:06 编辑

调用函数,不能直接将值传递过去(这就好比告诉你,有一个名叫 张山 的人,可是并没有告诉你,这个人的住址,你是找不到这个人的。或许长江路有叫张山的,黄河路上也有叫张山的,其他的城市也会有叫张山的),要传递值所在存贮区域的地址,这就是 10.2 没有改变,3.5 改变了的原因。
另外,你的程序有两个错误,已经帮你修改,看下面程序的注释
  1. #include <stdio.h>
  2. void sub(double a, double *pb);  // 分号不可少
  3. int main()
  4. {
  5.     double x,y;
  6.     scanf("%lf%lf",&x,&y);      // 输入 double 型,控制符号经用:%lf
  7.     sub(x, &y);                  // 将 x 、 & 作为函数的实际参数(简称:实参)
  8.     printf("x = %f y = %f\n",x,y);
  9. }
  10. void sub(double a,double *pb)    // 以 double a 和 double *pb 的形式参数(简称:形参)接收主调函数传递过来的实参
  11. {
  12.     a = a - *pb;
  13.     *pb = *pb - a;
  14. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那如果想要连a的值一同改变,是不是就需要将sub函数前的void改成想要的数据类型,再使用return返回函数的值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不用返回的,像 y 那样,将地传过去就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 11:25:42 | 显示全部楼层
不晓得我这么说你能不能理解,就是sub(x,&y)里面就是将x的值赋值给a,将y的地址赋值给*pb运算后*bp时-3.2,然后y的地址上的值就变为了这个值,而a只是将x值拿过来运算一下,并没有返回给x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我看明白你的解释了,就单纯的问一下我上面那么操作行不行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-26 13:06:34 | 显示全部楼层
时先生必上岸 发表于 2020-11-25 15:30
我看明白你的解释了,就单纯的问一下我上面那么操作行不行。

哦哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 09:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表