由于之前的答案相互矛盾,我自己找到了答案。
#include "stdio.h"
int main()
{
int array[] = {0,10,20,30,40,50,60};
int* p = &array[1];
int r;
int i = 1;
r = *p;
printf("%d, r = *p: r=%d, p points to %d\n", i++, r, *p);
r = *p++;
printf("%d, r = *p++: r=%d, p points to %d\n", i++, r, *p);
r = ++*p;
printf("%d, r = ++*p: r=%d, p points to %d\n", i++, r, *p);
r = *++p;
printf("%d, r = *++p: r=%d, p points to %d\n", i++, r, *p);
r = ++*p++;
printf("%d, r = ++*p++: r=%d, p points to %d\n", i++, r, *p);
printf("%d, ++p++: error: lvalue required as increment operand\n", i++);
printf("%d, *++p++: error: lvalue required as increment operand\n", i++);
printf("%d, (++p)++: C error: lvalue required as increment operand\n", i++);
printf("%d, ++p++: C++ p points to %d\n", i++, *p);
printf("%d, ++(p++): error: lvalue required as increment operand\n", i++);
return 0;
}
输出:
1, r = *p: r=10, p points to 10
2, r = *p++: r=10, p points to 20
3, r = ++*p: r=21, p points to 21
4, r = *++p: r=30, p points to 30
5, r = ++*p++: r=31, p points to 40
6, ++p++: error: lvalue required as increment operand
7, *++p++: error: lvalue required as increment operand
8, (++p)++: C error: lvalue required as increment operand
9, ++p++: C++ p points to 60
10, ++(p++): error: lvalue required as increment operand
1 预期的解引用
2 先解引用 p,然后将其递增
3 将 p 指向的位置递增,p 不变
4 先将 p 递增,然后解引用它
5 先递增 p 所指向的内容 (++*p)
,然后递增 p (p++)
6、7、10 无法递增中间值,因为它没有存储位置。
8、9 是“有趣”的。C 编译器会报告缺少 lvalue,但 C++ 不会。相反,如预期的那样,它会将 p 递增两次。然而,p += 2
更可取,因为它是可移植且更易理解的。
p
之前,你对其进行了解引用操作,但是没有对解引用后的值做任何处理。如果你想要递增指向的值,请使用(*ptr)++
。 - M Oehm