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

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

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

    return 0;
}


我发现该代码不会增加x的值。
当我改变时它起作用

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




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


现在有点与指针混淆了。
有人能帮我吗?
先感谢您!

最佳答案

这两段代码之间的区别是增加指针所包含的地址与更改实际值之间的区别。

第一段代码: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;
}

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


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

关于c - 整数指针作为函数的参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27439296/

10-11 23:06
查看更多