C 整数指针作为函数的参数

C 整数指针作为函数的参数,c,pointers,C,Pointers,我认为该代码不会增加x的值。 我换衣服的时候它就行了 void inc(int *p) { p += 1; } int main() { int x = 5; inc(&x); printf("x = %d\n", x); return 0; } 到 现在有点被指针弄糊涂了。 有人能帮我吗? 提前谢谢你 这两段代码之间的差异是增加指针包含的地址和更改实际值之间的差异 第一段代码:p+=1将p指向的地址增加1。例如,如果x位于地址124,那么

我认为该代码不会增加x的值。
我换衣服的时候它就行了

void inc(int *p) {
    p += 1;
}

int main() {
    int x = 5;
    inc(&x);

    printf("x = %d\n", x);

    return 0;
}

现在有点被指针弄糊涂了。
有人能帮我吗?

提前谢谢你

这两段代码之间的差异是增加指针包含的地址和更改实际值之间的差异

第一段代码:
p+=1
p
指向的地址增加1。例如,如果
x
位于地址124,那么
p
首先等于124,现在增加到125(在一个简单的场景中,实际上这将增加更多,因为
p
是一个整数指针,因此增加将超过1字节)

第二段代码:
*p+=1
首先取消引用
p
中的地址,并将一个地址添加到当前存储在该地址中的值。例如,如果
x
位于地址124且值为42,则
p
等于124,但
*p
是延迟指针且等于
42
。然后,您可以为
*p
分配一个新值,使地址124处的值(即
x
的值)等于
43

编辑:正如@Bathsheba所提到的,指针是通过值传递给函数调用的。这意味着,如果我们执行以下操作,原始指针
y
将保持不变,而
p
所指向的地址将发生如上所述的变化

void inc(int *p) {
    *p += 1;
}

至于你关于结构的第二个问题。结构指针仍然包含内存中结构的地址,但您引用的“箭头符号”将隐式地为您解除对字段的引用。

p
->x的地址,
*P
->地址指向interest的值,您认为指针是函数的参数与此有关。@Rizier123这与将结构指针作为参数不同吗?我注意到,当我把一个结构的指针作为一个参数时,我可以简单地使用箭头来改变它的值,而不用在它前面加星号@哈珀,我会的,谢谢你!当函数将结构的指针作为参数时会怎样?在给定结构中改变值时不需要星号;有什么区别?@Haxify:如果使用
运算符,则需要星号。如果您使用
something->foo
操作符,则它不是,
(*something.foo
void inc(int *p) {
    *p += 1;
}
void inc(int *p) {
    p += 1;
}

int main() {
    int x = 5;
    int *y = &x;
    inc(y);
    return 0;
}