指针和指针说明

pointer and pointer clarification

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 *)

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

这就是指针的工作方式,与函数的 return 值无关。

你的 trouble(&x, &y); 调用跳转到 trouble 函数并将 x 的地址从 main 分配给 x in trouble (x in trouble指向 main 中的 x)。 y 也是如此。 所以第一个 double_trouble 调用看起来像 double_trouble( <the address of x from main>, 7); 所以 p 从 main 指向 x 所以 *p =... 从 main 改变 x.

如果变量有不同的名字会更容易解释和理解。

这里出现了一些命名混乱。一旦你完成它,你会发现一切都按预期工作。

I mean it's void, the stored value will be deleted, won't it?

这里涉及三个整数变量:mainxy,以及 double_troublex。为了区分它们,我将前两个称为 m::xm::y,而最后一个将是 dt::x.

您的 trouble 函数将指针作为指针 p 传递给 m::x,将 m::y 传递给 double_trouble。在第一次调用中,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 - 13m::y = 7相同。