指针算术:++ * 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)++
代替。