C 指针和指针澄清

C 指针和指针澄清,c,function,pointers,C,Function,Pointers,对于上面的代码,我知道x和y的输出应该是13和7。 但是我有点困惑,既然它是空的,为什么它的值 是否仍存储在x和y中?换句话说,自从 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); }

对于上面的代码,我知道
x
y
的输出应该是13和7。 但是我有点困惑,既然它是空的,为什么它的值 是否仍存储在
x
y
中?换句话说,自从

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
的值仍然是13?我的意思是它是无效的,存储的值将被删除,不是吗

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

double_trouble(x, 7);

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

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

您的
问题(&x和&y)调用跳转到
trouble
函数,并将
x
的地址从main分配到
x
故障(
x
故障点分配到
x
故障点)。同样的情况也发生在
y
上。 因此,第一个
double\u trouble
调用看起来像
double\u trouble(,7)
So
p
从main指向
x
,So
*p=…
从main更改
x


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

这里出现了一些命名混乱。一旦你用你的方式完成了它,你会发现一切都完全按照它应该的方式工作

我的意思是它是
void
,存储的值将被删除,不是吗

这里有三个整数变量:主
main
x
y
,以及
double\u故障的
x
。为了区分它们,我将前两个称为
m::x
m::y
,而最后一个是
dt::x

您的
trouble
函数将指向
m::x
m::y
的指针作为指针传递给
double\u trouble
。在第一个调用中,
p
指的是
m::x
,因此赋值

void trouble(int *, int *)
意思与

*p = 2 * x - y;
带有
7
作为
double\u-trouble
的参数。由于
dt::x
之前已分配了10个,因此这将成为一个分配
m::x=20-7
,或者干脆是
m::x=13

在第二次调用中,
y
被传递
m::x
的值,并且
p
指向
m::y
,因此相同的表达式对应于此:

m::x = 2 * dt::x - 7;

这与
m::y=20-13
m::y=7

相同,故障函数中的x值不是13。x的值是某个内存地址,其中包含一个值为13的整数。该整数在main中也被命名为x。这是个坏主意。它应该被称为xp或类似的麻烦。Thx@dasblinkenlight,现在清楚多了。还有一个问题,当我们调用void函数时,只会存储指针对象的地址,而不会删除它?在学习指针之前,我非常确定,一旦调用void函数,存储在void函数中的值将被删除。@Wii当调用void函数时,它的任何修改都将对外部函数“不可见”,除非它们是通过指针完成的。对局部变量或参数所做的修改(包括对指针本身的修改)在调用者中被忽略:值超出范围,变得不可访问(尽管称之为“删除”并不正确,因为对值本身没有做任何操作)。
m::y = 2 * dt::x - m:x;