指针算术:++*ptr或*ptr ++?

ipk*_*iss 20 c pointers increment operator-precedence dereference

我学习C语言和相当混乱之间的差异++*ptr*ptr++.

例如:

int x = 19;
int *ptr = &x;
Run Code Online (Sandbox Code Playgroud)

我知道++*ptr*ptr++产生不同的结果,但我不知道为什么会这样?

tem*_*def 47

由于运算符绑定的方式,这些语句产生不同的结果.特别是,前缀++运算符具有相同的优先级*,并且它们从右向左关联.从而

++*ptr
Run Code Online (Sandbox Code Playgroud)

被解析为

++(*ptr)
Run Code Online (Sandbox Code Playgroud)

意思是"增加指向的值ptr,".另一方面,后缀 ++运算符的优先级高于dereferrence运算符*.Thefore

*ptr++
Run Code Online (Sandbox Code Playgroud)

手段

*(ptr++)
Run Code Online (Sandbox Code Playgroud)

这意味着"评估当前指向的值ptr,并增加"的值ptr(未指定其顺序).

在您描述的上下文中,您可能想要编写++*ptr,这将x间接增加ptr.写作*ptr++会很危险,因为它会ptr前进过去x,而且由于x它不是数组的一部分,指针会悬浮在内存中的某个位置(也许在它自身之上!)

希望这可以帮助!

  • @instinct:不,后一种形式甚至不等同于`*(ptr ++)`. (2认同)

ver*_*ose 8

接受的答案是不正确的.事实并非后缀++运算符具有与解除引用/间接相同的优先级*.前缀和后缀运算符具有不同的优先级,只有前缀运算符具有与解除引用/间接相同的优先级.

作为优先顺序表所示,后缀++具有更高比解引用/间接优先*.因此*ptr++被评估为*(ptr++).ptr++评估当前值ptr; 它ptr仅作为副作用递增.表达式的值与当前值相同ptr.因此它不会对存储在指针处的值产生任何影响.它只是取消引用指针(即,获取存储在那里的当前值,即19),然后前进指针.在您的示例中,没有定义的值存储在新位置ptr,因此指针指向垃圾.现在取消引用它将是危险的.

同样如表所示,prefix ++与dereference/indirection具有相同的优先级*,但由于左右关联性,它被评估为++(*ptr).这将首先取消引用指针(即,获取存储在指向的地址处的值),然后递增该值.即,现在价值为20.

接受的答案对于两者的影响是正确的,但实际机制与那里给出的机制不同.