指针和指针说明
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);
}
对于上面的代码,我知道 x
和 y
的输出应该是 13 和 7。
但是我有点困惑,因为它是无效的,为什么价值
仍然存储在 x
和 y
中?也就是说,因为
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?
这里涉及三个整数变量:main
的 x
和 y
,以及 double_trouble
的 x
。为了区分它们,我将前两个称为 m::x
和 m::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 - 13
或m::y = 7
相同。
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 *)
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?
这里涉及三个整数变量:main
的 x
和 y
,以及 double_trouble
的 x
。为了区分它们,我将前两个称为 m::x
和 m::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 - 13
或m::y = 7
相同。