本帖最后由 liulinjie 于 2014-4-28 22:49 编辑
运算符的优先级: *++p 先加加p再取*值, *p++先做*运算再加p. 如果有括号, 先运算括号.
你的例子: (因为p有时会加加, 所以把num写成一个数组来说明比较方便)
// p是一个整形指针, 所以每次 p+1 都是挪一个int的位置
int *p;
// 用一个数组来说明比较方便
int num[3] = {1, 2, 3};
// 让 p 指向数组的第一个数字 (或者 p = num)
p = &num[0];
// 打印 p 的值,即 num[0] 的地址,是一个16进制数
printf("The address of num is : %p\n",p);
// 打印 p 指向的int的值,即 num[0] 的值, 打印结果是 1
printf("The value of num is : %d\n",*p);
// *p++: 同等级, 从左往右, 先作*运算, 再把 p 加加
// 打印的是 *p 的值, 即 num[0] 的值, 打印结果为 1
// 之后把 p++, p 指向 num[1]
printf("The *p++ is : %d\n",*p++);
// (*p)++: 先运算括号, *p 等价于 num[1], 所以这里打印num[1], 再把num[1]加加
// 打印结果为 2, 之后 num[1] = 3. 此时数组num为 {1, 3, 3} // 注意 p 并没有加加, 依然指向 num[1]
printf("The (*p)++ is : %d\n",(*p)++);
// *(p++): 先运算括号, 括号里是后置加加, 所以先返回 *p, 再把 p++
// 打印 *p 即 num[1] 的值, 此时 num[1]= 3. 之后 p++, p 指向num[2]
printf("The *(p++) is : %d\n",*(p++));
// (*p)++: 先运算括号, *p 等价于 num[2], 所以先打印 num[2], 再把num[2]加加
// 打印结果为 3, 之后 num[2] = 4. 此时的数组num为 {1, 3, 4}. p 没变, 依然指向 num[2]
printf("The (*p)++ is : %d\n",(*p)++);
|