指针和指针澄清

时间:2015-02-17 16:45:03

标签: c function pointers

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);
}

对于上面的代码,我知道xy的输出应为13和7。 但是我有点困惑,因为它处于无效状态,为什么会有价值 仍存储在xy中?换句话说,因为

double_trouble(x, 7);

被调用,为什么x的值仍为13?我的意思是它无效,存储的值将被删除,赢得它?

如果我的问题不是很清楚,请在

中解释一下函数调用
void trouble(int *, int *)

2 个答案:

答案 0 :(得分:2)

这里有一些命名混乱。一旦你完成它,你会发现一切都完全正常。

  

我的意思是void,存储的价值会被删除,赢了吗?

此处有三个整数变量:x的{​​{1}}和y以及main的{​​{1}}。为了区分它们,我将前两个称为xdouble_trouble,而最后一个称为m::x

您的m::y函数将指向dt::xtrouble的指针传递给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 = 13y指向m::x,因此相同的表达式对应于此:

p

m::ym::y = 2 * dt::x - m:x; 相同。

答案 1 :(得分:1)

p指向main的x,因此向*p写一些内容也会更改main中的x

这就是指针的工作原理,与函数的返回值无关。

您的trouble(&x, &y);来电跳转至trouble功能,并将x的地址从主要地址x分配给遇到问题的x x主要是ydouble_trouble也是如此。 因此,第一个double_trouble( <the address of x from main>, 7);调用看起来像p所以x从主要*p =...指向x,因此从{{1}}更改为{{1}}。

如果变量具有不同的名称,则更容易解释和理解。