c语言指针问题,求大神解答

#includevoidsub(doublex,double*y,double*z){*y=*y-1.0;*z=*z+x;}main(){doublea=2.5,b=9.... #includevoid sub (double x,double *y,double *z)
{*y=*y-1.0;*z=*z+x;}
main()
{double a=2.5,b=9.0,*pa,*pb;
pa=&a;pb=&b;
sub(b-a,pa,pa);
printf("%f\n",a);}

输出是8.00000

我想问这到底怎么来的,pa=&a,sub函数里的*y,*z都为2.5 x为6.5. 那么这样的话接着往下代,*y=1.5,*z=9 但是他们2又都指向a,这就混乱了啊,咋回事啊。求大神说详细点啊~~
展开
 我来答
有事说事
2013-07-23 · TA获得超过116个赞
知道答主
回答量:198
采纳率:0%
帮助的人:88.5万
展开全部
#include<stdio.h>

void sub (double x,double *y,double *z)
{
    //此时x = b - a 即 x = 6.5
    *y=*y-1.0; // a = a - 1.0 即 a = 1.5  注意:a的值已经发生变化
    *z=*z+x;   // a = a + x 即 a = 1.5 + 6.5 
    //此时a的值又发生变化,变成8了。
}

main()
{
    double a=2.5, b=9.0, *pa, *pb;
    pa=&a;
    pb=&b;
    sub(b-a, pa, pa);
    printf("%f\n",a);
}
追问
哦,是的,我明白过来了。谢谢
哦,是的,我明白过来了。谢谢
isoledadcache
2013-07-23
知道答主
回答量:4
采纳率:0%
帮助的人:2万
展开全部
b-a 取值 6.5; *pa 即 a 取值 2.5; 由于sub的后面两个参数是传址的,也就是说,sub内部对后两个参数所作的修改,会直接反映到传参者所在的栈空间,即修改调用者栈空间变量。
sub(b-a, pa, pa) => *pa = *pa - 1.0 = 1.5;
=> *pa = *pa + (b - a) = 1.5 + (9.0 - 2.5) = 1.5 + 6.5 = 8;
因为是浮点型打印,所以是 8.00000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
huangxinzbz
2013-07-23 · TA获得超过589个赞
知道小有建树答主
回答量:266
采纳率:100%
帮助的人:331万
展开全部
#include
void sub (double x,double *y,double *z)
{//x = 9.0 - 2.5 = 6.5
//当下y与z指向的都是a的地址&a
*y=*y-1.0;// *y = 2.5 - 1.0 = 1.5
*z=*z+x; // *z = 1.5 + 6.5 = 8.0
}
main()
{
double a=2.5,b=9.0,*pa,*pb;
pa=&a;
pb=&b;
sub(b-a,pa,pa);//参数都是pa
printf("%f\n",a);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
GodHlpMe
2013-07-23 · TA获得超过8455个赞
知道大有可为答主
回答量:4600
采纳率:46%
帮助的人:946万
展开全部
printf("%f\n",a); 不是 %f 是 %lf
因为是double
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-23
展开全部
你的分析没有逻辑问题,只是最后一步1.5+6.5等于8你算成了9。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式