递增指针(ptr ++)和(* ptr ++)
当我怀疑时,我正在重新审视指针。
int *ptr; int arr[5] = {10,20,30,40,50}; ptr = &arr[0];
现在是printf("Value: %d",*ptr);
会打印10
如果我做:
ptr++; printf("Value: %d",*ptr);
结果将是: 20
同样,如果我这样做:
*ptr++; printf("Value: %d",*ptr);
结果是: 30
但
printf("Value: %d",++*ptr);
给了我31
我认为,因为当我递增它时, ptr
是int
类型,它会跳转4个字节到下一个内存位置。 但为什么它对*ptr++
和ptr++
显示相同的行为而不是++*ptr
?
第一个片段是显而易见的:它打印出ptr
指向的内容,即10。
第二个,将指针向前移动一个元素,然后指向下一个元素,即20。
第三个片段与前一个片段完全相同,因为它的第一个指令递增指针并返回未增加的值,该值被解除引用,但其结果被丢弃; printf
取消引用的是递增指针,现在指向30。
最后一个片段是不同的: ++*ptr
是++(*ptr)
; *ptr
dereferences ptr
(已经指向30
),产生30,并且++
增加这样的值,变为31。
因为优先 。
-
*ptr++
与*(ptr++)
,指针递增,但其前一个值被解除引用。 -
ptr++
与ptr++
相同。 -
++*ptr
与++(*ptr)
,即它增加指向的东西,而不是指针。
当你执行* ptr++
,你实际上正在做* (ptr++)
,所以指针增加,而不是它指向的变量
当++ *ptr
,它实际上是++(* ptr)
,因此它会增加指针返回的值
高优先级的C优先顺序:
()
++
*& 指针
* /
+ –
所以,
*ptr++ equivlant to *(ptr++) ++*ptr equivlant to ++(*ptr)
并为此行* ptr ++; 它只会增加ptr指针。
这样做的诀窍是,无论何时两者都是一元运算符,关联性都是从右到左。
* ptr ++ – >首先递增指向下一个位置的指针,然后取消引用该位置的值。
类似地,* ++ ptr – >首先递增指针然后取消引用。
++ * ptr – >首先在ptr处取消引用值,然后递增该值。