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

我正在学习C语言,并且很困惑++*ptr*ptr++之间的差异。

例如:

 int x = 19; int *ptr = &x; 

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

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

 ++*ptr 

被解析为

 ++(*ptr) 

意思是“增加ptr指向的值”。 另一方面, postfix ++运算符的优先级高于dereferrence运算符* 。 Thefore

 *ptr++ 

手段

 *(ptr++) 

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

在您描述的上下文中,您可能希望编写++*ptr ,它将通过ptr间接递增x 。 编写*ptr++会很危险,因为它会将ptr向前推进x ,并且因为x不是数组的一部分,所以指针会悬浮在内存中的某个位置(可能在它自身之上!)

希望这可以帮助!

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

如优先级表所示,postfix ++的优先级高于dereference / indirection * 。 所以*ptr++被评估为*(ptr++)ptr++计算为ptr++的当前值; 它只增加ptr作为副作用。 表达式的值与ptr的当前值相同。 因此它不会对存储在指针处的值产生任何影响。 它只是取消引用指针(即,获取存储在那里的当前值,即19),然后推进指针。 在您的示例中,没有定义的值存储在ptr的新位置,因此指针指向垃圾。 现在取消引用它将是危险的。

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

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

正如templatetypedef所说,但你应该在*ptr周围提供括号以确保结果。 例如,以下内容在我的计算机上使用GCC和0使用CLang产生1606415888:

 int x = 19; int *ptr = &x; printf("%d\n", *ptr++); printf("%d\n", *ptr); 

并且你期望x为20.所以使用(*ptr)++代替。