void double_trouble(int *p, int y);
void trouble(int *x, int *y);
int
main(void)
{
int x, y;
trouble(&x, &y);
printf("x = %d, y = %d\n", x, y);
return (0);
}
void
double_trouble(int *p, int y)
{
int x;
x = 10;
*p = 2 * x - y;
}
void
trouble(int *x, int *y)
{
double_trouble(x, 7);
double_trouble(y, *x);
}
对于上面的代码,我知道x
和y
的输出应为13和7。
但是我有点困惑,因为它处于无效状态,为什么会有价值
仍存储在x
和y
中?换句话说,因为
double_trouble(x, 7);
被调用,为什么x
的值仍为13?我的意思是它无效,存储的值将被删除,赢得它?
如果我的问题不是很清楚,请在
中解释一下函数调用void trouble(int *, int *)
答案 0 :(得分:2)
这里有一些命名混乱。一旦你完成它,你会发现一切都完全正常。
我的意思是
void
,存储的价值会被删除,赢了吗?
此处有三个整数变量:x
的{{1}}和y
以及main
的{{1}}。为了区分它们,我将前两个称为x
和double_trouble
,而最后一个称为m::x
。
您的m::y
函数将指向dt::x
和trouble
的指针传递给m::x
作为指针m::y
。在第一次通话中,double_trouble
引用p
,因此分配
p
与
相同m::x
*p = 2 * x - y;
作为m::x = 2 * dt::x - 7;
的参数。由于之前已为7
分配了10个,因此这将成为作业double_trouble
,或仅dt::x
。
在第二次通话中,m::x = 20 - 7
传递的值为m::x = 13
,y
指向m::x
,因此相同的表达式对应于此:
p
与m::y
或m::y = 2 * dt::x - m:x;
相同。
答案 1 :(得分:1)
p
指向main的x
,因此向*p
写一些内容也会更改main中的x
。
这就是指针的工作原理,与函数的返回值无关。
您的trouble(&x, &y);
来电跳转至trouble
功能,并将x
的地址从主要地址x
分配给遇到问题的x
x
主要是y
。 double_trouble
也是如此。
因此,第一个double_trouble( <the address of x from main>, 7);
调用看起来像p
所以x
从主要*p =...
指向x
,因此从{{1}}更改为{{1}}。
如果变量具有不同的名称,则更容易解释和理解。