C 递增指针(ptr+;+;)和(*ptr+;+;)

C 递增指针(ptr+;+;)和(*ptr+;+;),c,pointers,C,Pointers,当我有这个疑问时,我正在重温指针 int *ptr; int arr[5] = {10,20,30,40,50}; ptr = &arr[0]; 现在printf(“值:%d”,*ptr)将打印10 如果我这样做: ptr++; printf("Value: %d",*ptr); 结果将是:20 同样,如果我这样做: *ptr++; printf("Value: %d",*ptr); 结果是:30 但是 给我31 我认为,由于ptr是int类型,当我增加它时,它将跳转4个字节到下一

当我有这个疑问时,我正在重温指针

int *ptr;
int arr[5] = {10,20,30,40,50};
ptr = &arr[0];
现在
printf(“值:%d”,*ptr)将打印
10

如果我这样做:

ptr++;
printf("Value: %d",*ptr);
结果将是:
20

同样,如果我这样做:

*ptr++;
printf("Value: %d",*ptr);
结果是:
30

但是

给我
31

我认为,由于
ptr
int
类型,当我增加它时,它将跳转4个字节到下一个内存位置。但是,为什么它对
*ptr++
ptr++
显示相同的行为,而对
++*ptr
则不显示相同的行为呢?

因为优先级

  • *ptr++
    *(ptr++)
    相同,指针递增,但其先前的值被取消引用
  • ptr++
    ptr++
    相同
  • ++*ptr
    ++(*ptr)
    相同,即它增加指向的对象,而不是指针

当您执行
*ptr++
时,实际上您正在执行
*(ptr++)
,因此指针将递增,而不是它指向的变量


++*ptr
时,它实际上是
++(*ptr)
,因此它增加指针返回的值

第一个片段很明显:它打印
ptr
指向的内容,即10

第二个,将指针向前移动一个元素,然后指向下一个元素,即20

第三个代码段与前一个代码段完全相同,因为它的第一条指令递增指针并返回未加增的值,该值被取消引用,但其结果被丢弃;
printf
中取消引用的是递增的指针,它现在指向30


最后一段不同:
+*ptr
+(*ptr)
*ptr
取消引用
ptr
(已指向
30
),产生30,并且
++
增加该值,该值变为31。

C优先级从高优先级开始的顺序:

()
++
*用于指针的(&F)
*/
+-

所以


对于这一行*ptr++;它只会增加ptr指针。

其中的技巧是,当两者都是一元运算符时,关联性是从右向左的

*ptr++-->第一个指向下一个位置的增量指针,然后取消引用该位置的值

类似地,*++ptr-->首先递增指针,然后取消引用


++*ptr-->首先在ptr处取消引用值,然后增加该值。

当我执行
*(ptr++)
时,是否应该取消引用
ptr
的值并增加它,而不是增加指向下一个内存位置的指针?这不正是
++(*ptr)
所发生的吗?@noMAD:不,因为在
*(ptr++)
中,括号表示
++
应用于
ptr
,而不是
*ptr
printf("Value: %d",++*ptr);
 *ptr++ equivlant to *(ptr++)
 ++*ptr equivlant to ++(*ptr)