0

当我有这个疑问时,我正在重新审视指针。

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呢?

4

5 回答 5

7

因为优先

  • *ptr++与 相同*(ptr++),指针增加,但其先前的值被取消引用。
  • ptr++是一样的,嗯,ptr++
  • ++*ptr与 相同++(*ptr),即它增加被指向的东西,而不是指针。
于 2012-04-08T20:43:25.493 回答
3

当你这样做时* ptr++,你实际上是在做* (ptr++),所以指针会增加,而不是它指向的变量

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

于 2012-04-08T20:46:08.053 回答
2

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

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

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

最后一个片段是不同的:++*ptris ++(*ptr); *ptr取消引用ptr(已经指向30),产生 30,并++增加这个值,变成 31。

于 2012-04-08T20:47:07.393 回答
1

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

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

所以,

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

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

于 2016-05-05T14:58:19.390 回答
1

诀窍在于,只要两者都是一元运算符,则关联性是从右到左的。

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

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

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

于 2017-08-01T08:35:48.013 回答