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 *)
最佳答案
这里存在一些命名困惑。一旦你按照自己的方式进行操作,你就会发现一切都完全按照预期进行。
I mean it's
void
, the stored value will be deleted, won't it?
这里使用了三个整型变量:main
的 x
和 y
以及 main
的 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
作为 double_trouble
的参数。由于 dt::x
之前已被赋值 10,因此这变成了赋值 m::x = 20 - 7
,或者简单地 m::x = 13
.
在第二次调用中,y
传递了 m::x
的值,并且 p
指向 m::y
,所以相同的表达式对应于:
m::y = 2 * dt::x - m:x;
与m::y = 20 - 13
或m::y = 7
相同。
关于c - 指针和指针澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566520/