c语言指针传递原来值到底变不变请教大神

学无止境one 2015-12-13 06:37:43

#include <stdio.h>
//返回指针参数
int* qiuhe2(int *x)
{
*x = *x + *x;
return x;
}
main()
{
int x = 4;//问题是调用后X的值到底变不变
//int *p ;
//p = qiuhe2(&x);
//printf("调用后返回值:%d,调用后x=%d\n",*p,x); //定义一个指针接受返回值这样写x的值变了

//直接在打印函数里调用x的值没有改变???
printf("调用后返回值:%d,调用后x=%d\n", *qiuhe2(&x),x);
//控制台阻塞
getchar();
}

...全文
625 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
对面有只小鸡 2015-12-13
  • 打赏
  • 举报
回复
printf()不是函数! printf()的参数是从右向左计算的!
wang0635 2015-12-13
  • 打赏
  • 举报
回复
C语言只有传值调用 所有的实参都不会变 通过参数找到的其他内容有可能被改变
pingdan32 2015-12-13
  • 打赏
  • 举报
回复
引用 4 楼 srx942173347 的回复:
[quote=引用 1 楼 aini_dianlu 的回复:] 函数参数的压栈顺序导致的,就你后面这段打印在不同的编译器上有可能会导致结果不同
请问以后编程怎样避免这样的情况?[/quote] 很简单,在同一个函数的多个参数之间如果有互相计算关系,不要再直接在参数中嵌套调用。 最简单的避免方法就是,先计算函数的值然后再将此值传入函数就行,不要直接嵌套调用。 像你这种情况,如果项目很大,这个隐含的bug会坑死很多人!!!
paschen 2015-12-13
  • 打赏
  • 举报
回复
x变量的地址是复制进函数的,所以返回值(复制后的地址)与原X地址肯定不同 x本身则是相同的,函数中修改的值会反应到X变量
学无止境one 2015-12-13
  • 打赏
  • 举报
回复
引用 1 楼 aini_dianlu 的回复:
函数参数的压栈顺序导致的,就你后面这段打印在不同的编译器上有可能会导致结果不同
请问以后编程怎样避免这样的情况?
pingdan32 2015-12-13
  • 打赏
  • 举报
回复
刚才在手机上回答的,现在上电脑详细解释一下。 1,这个函数qiuhe2调用之后肯定是会导致传入的参数值发生变化的,这个是毫无疑问的,在这一点上就不用纠结了。 2,C语言中,调用函数时会系统会讲函数的参数压入栈,之后执行函数代码。那么问题来了,对于多个参数,先压入 哪一个参数呢?也就是说,函数的参数时从左到右压栈还是从右到左?这个具体的编译器以及平台会有不同的结果, 有的是从左到右,有的编译器是从右到左。 3,所以,你得问题情况就是如下: a,系统在调用printf时,如果参数从左到右压栈,那么*qiuhe(&x)会比x先执行计算,所以到计算x的时候,其实此时x的值已经 在计算qiuhe(&x)的时候被改变了,此时,x被打印出来就是改变之后的结果。 b,如果系统是从右到左压站,那么,x先别传入printf,之后qiuhe2才会被调用计算出结果并传入printf,此时,打印出的x的 值就是为被改变之前的值。此时就看起来好像是x的值“没变”,其实x的值已经变了,只不过,x先被值传递到printf的而已。
_郭 2015-12-13
  • 打赏
  • 举报
回复
你在16行之后加一句: printf(",调用后x=%d\n", x); 看结果思考一下
pingdan32 2015-12-13
  • 打赏
  • 举报
回复
函数参数的压栈顺序导致的,就你后面这段打印在不同的编译器上有可能会导致结果不同

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧