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

时间:2012-04-08 20:40:27

标签: c pointers

当我怀疑时,我正在重新审视指针。

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显示相同的行为?

5 个答案:

答案 0 :(得分:5)

由于优先级

  • *ptr++*(ptr++)相同,指针会递增,但之前的值会被取消引用。
  • ptr++ptr++相同。
  • ++*ptr++(*ptr)相同,即它会增加指向的东西,而不是指针。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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

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

最后一个代码段不同:++*ptr++(*ptr); *ptr解除引用ptr(已指向30),产生30和++增量此值,即31。

答案 3 :(得分:1)

高优先级的C优先顺序:

  

()
  ++
  *& 指针
  * /
  + -

所以,

 *ptr++ equivlant to *(ptr++)
 ++*ptr equivlant to ++(*ptr)

并为此行* ptr ++;它只会增加ptr指针。

答案 4 :(得分:0)

这方面的诀窍是,无论何时两者都是一元运算符,关联性都是从右到左。

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

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

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