这些指针之间有区别吗?每次通话到底发生了什么。
最佳答案
1和3是一样的。
请记住 ++
的后缀和一元形式。和 --
有一个结果和一个副作用:
x++
的结果是 x
的当前值- 作为副作用,x
递增 1(如果 x
是指针,则递增以指向序列中的下一个对象); ++x
的结果是 x
的当前值加 1 - 作为副作用,x
加 1(如果 x
是指针,则结果是序列中下一个对象的地址,x
更新为指向序列中的下一个对象); --
的两种形式以相同的方式工作,除了值减 1 - 如果它是一个指针,那么它被设置为指向序列中的前一个对象。当您将指针取消引用放入混合中时,您会得到以下结果:
*p++
被解析为 *(p++)
(*(p)++
也是如此)。 *p++
的结果是 *p
的当前值(事物的值 p
当前指向)。作为副作用,p
递增以指向序列中相同类型的下一个对象(IOW,数组的下一个元素); (*p)++
被解析为书面。 (*p)++
的结果是 *p
的当前值.作为副作用,*p
加 1。也就是说,被指向的东西的值被更新,而不是指针。 ++*p
被解析为 ++(*p)
. ++*p
的结果是 *p
的当前值加 1. 作为副作用,*p
加 1。*++p
被解析为 *(++p)
. *++p
的结果是对象 p
之后的对象的值目前指向。作为副作用,p
递增以指向下一个对象。 假设以下声明:
int a[] = {1, 2, 3, 4};
int *p = a;
在这些行之后,
p
的值是 &a[0]
.所以,给定表达式x = *p++;
*p++
的结果是 1
(事物的值 p
当前指向),它被分配给 x
.副作用是 p
更新为指向 a[1]
.然后我们执行
x = (*p)++;
(*p)++
的结果是事物的值(value)p
当前指向(如果 p
指向 a[1]
,则值为 2
),它被分配给 x
.作为副作用,事情p
指向增加(如果 p
指向 a[1]
,那么 a[1]
的值现在是 3
)。我们执行
x = ++*p;
++*p
的结果是事物的值(value)p
指向加 1,结果是 p
指向增加(如果 p
指向 a[1]
,则 a[1] + 1
的值是 4
,它被分配给 x
,而 a[1]
的值现在是 4
)。最后,我们执行
x = *++p;
*++p
的结果是 p
的对象后面的对象的值当前指向和p
递增以指向该对象(如果 p
指向 a[1]
,则 a[2]
( 3
)的值被写入 x
,并且 p
被更新为指向 a[2]
) .再次,
--
以同样的方式工作,只是在另一个方向。
关于c - C : *source++, (*source)++, *(source)++ 中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031546/