递增指针(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

我认为,因为当我递增它时, ptrint类型,它会跳转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处取消引用值,然后递增该值。