c - 指针和指针澄清

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

最佳答案

这里存在一些命名困惑。一旦你按照自己的方式进行操作,你就会发现一切都完全按照预期进行。

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

这里使用了三个整型变量:mainxy 以及 mainx double_trouble。为了区分它们,我将前两个称为 m::xm::y,而最后一个为 dt::x.

您的 trouble 函数将指向 m::xm::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 - 13m::y = 7相同。

关于c - 指针和指针澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566520/

相关文章:

C unnnamed pipes and fork 用于计算

c - 如何在 glade 中设置按钮的 Action ?

javascript - 链接两个函数的最佳实践,AngularJs/JavaScript

c - 保留 Windows 内容 ncurses

c - strcpy 时出现段错误

javascript - 如何修改 setInterval 代码以最初触发间隔操作

C++ 变量和函数

c - (const char *str) , (char const *str) 和 (char *const str) 之间有什么区别?

c++ - STD 指向指针的迭代器;获取应该等效的代码的不同类型?

ios - 空指针的取消引用