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;
}
现在对指针感到困惑。
有人能帮帮我吗?
提前谢谢!
答案 0 :(得分:1)
两段代码之间的区别在于增加指针所包含的地址与更改实际值之间的差异。
第一段代码:p += 1;
会将p
指向的地址增加一个。例如,如果x
位于地址124,那么p
首先等于124,现在增加到125(在一个简单的情况下,实际上这会增加更多,因为p
是整数指针,因此增加将超过1个字节)。
第二段代码:*p +=1;
首先取消引用p
中的地址,并将当前存储在该地址中的值加1。例如,如果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;
}
关于结构的第二个问题。结构指针仍然包含内存中结构的地址,但是您引用的“箭头符号”将隐式地为您解除引用字段。