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)