函数形参与实参返回值的疑惑
#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没有改变。 sub(double x , double * y) 这个函数的”长相”本来就是 x 不可变,* y 可变。 jackz007 发表于 2020-11-24 11:58
sub(double x , double * y) 这个函数的”长相”本来就是 x 不可变,* y 可变。
能直白一点吗? 时先生必上岸 发表于 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-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;
} 风过无痕1989 发表于 2020-11-24 13:49
调用函数,不能直接将值传递过去(这就好比告诉你,有一个名叫 张山 的人,可是并没有告诉你,这个人的住址 ...
那如果想要连a的值一同改变,是不是就需要将sub函数前的void改成想要的数据类型,再使用return返回函数的值? 时先生必上岸 发表于 2020-11-24 15:26
那如果想要连a的值一同改变,是不是就需要将sub函数前的void改成想要的数据类型,再使用return返回函数的 ...
不用返回的,像 y 那样,将地传过去就行了 不晓得我这么说你能不能理解,就是sub(x,&y)里面就是将x的值赋值给a,将y的地址赋值给*pb运算后*bp时-3.2,然后y的地址上的值就变为了这个值,而a只是将x值拿过来运算一下,并没有返回给x 黎明gg 发表于 2020-11-25 11:25
不晓得我这么说你能不能理解,就是sub(x,&y)里面就是将x的值赋值给a,将y的地址赋值给*pb运算后*bp时-3. ...
我看明白你的解释了,就单纯的问一下我上面那么操作行不行。{:5_109:} 时先生必上岸 发表于 2020-11-25 15:30
我看明白你的解释了,就单纯的问一下我上面那么操作行不行。
哦哦{:5_95:}{:5_95:}{:5_95:}
页:
[1]