当我怀疑时,我正在重新审视指针。
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
显示相同的行为?
答案 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处首先取消引用值,然后递增该值。