我正在学习 C 语言,但是对 ++*ptr
和 *ptr++
之间的区别感到相当困惑。
例如:
int x = 19;
int *ptr = &x;
我知道++*ptr
和*ptr++
会产生不同的结果,但我不确定为什么会这样?
我正在学习 C 语言,但是对 ++*ptr
和 *ptr++
之间的区别感到相当困惑。
例如:
int x = 19;
int *ptr = &x;
我知道++*ptr
和*ptr++
会产生不同的结果,但我不确定为什么会这样?
这些语句产生不同的结果是因为运算符绑定的方式不同。特别地,前缀++
运算符与*
具有相同的优先级,并且它们从右到左结合。因此
++*ptr
被解析为
++(*ptr)
意思是“递增指针ptr
所指向的值”。另一方面,后缀++
操作符比解引用运算符*
的优先级高,因此
*ptr++
意思是
*(ptr++)
这意味着“将ptr
增加到指向其后面的元素,然后解除引用其旧值”(由于后缀 ++
返回指针以前拥有的值)。++*ptr
,它将通过ptr
间接递增x
。编写*ptr++
会很危险,因为它会在x
之后前进ptr
,并且由于x
不是数组的一部分,指针将在内存中悬挂(也许在自身之上!) ++
运算符的优先级与取消引用/间接寻址 *
不同。前缀和后缀运算符具有不同的优先级,只有前缀运算符与取消引用/间接寻址具有相同的优先级。 ++
比取消引用/间接寻址 *
的优先级高。因此* ptr++
被计算为 *(ptr++)
。ptr ++
评估为ptr
的当前值;它仅作为副作用递增ptr
。表达式的值与ptr
的当前值相同。因此,它不会对指针存储的值产生任何影响。它只会取消引用指针(即获取存储在其中的当前值(即19)),然后推进指针。在您的示例中,在ptr
的新位置上没有定义的存储值,因此指针指向垃圾。现在解除引用它将是危险的。 ++
与取消引用/间接寻址 *
具有相同的优先级,但由于右-左结合性,它被计算为 ++ (* ptr)
。这将首先解除引用指针(即获取在地址指向的值),然后递增该值。即,值现在为20。*ptr
周围提供括号以确保结果。例如,以下在我的计算机上使用GCC生成1606415888,而使用CLang生成0:int x = 19;
int *ptr = &x;
printf("%d\n", *ptr++);
printf("%d\n", *ptr);
你期望x
的值为20。因此请使用(*ptr)++
。
*ptr++
相当于*(ptr++)
相当于*(ptr = ptr + sizeof(datatype))
。 - instinct*ptr++
会非常有用。 - jAYANT YADAV*(ptr++)
。 - AnT stands with Russiaptr + sizeof(datatype)
实际上会移动sizeof(datatype) * sizeof(datatype)
字节。请参见此示例。 [注意:由于-xc
命令行选项,示例编译为 C 而不是 C++。] - Justin Time - Reinstate Monica