*p++
等同于 *p; p += 1;
#include <stdio.h>
int main(void)
{
int a[5] = {555, 444, 333, 222, 111};
int *p;
p = a;
// p = &a[0];
// p += 1;
//指针+1,表示指向下一格
printf("*p = %d.\n", *p++);
for (int i = 0; i < 5; i++){
printf("*p = %d.\n", *(p+i));
}
}
结果是:
*p = 555.
*p = 444.
*p = 333.
*p = 222.
*p = 111.
解释如下:
按运算符的优先级,*和++是同一优先级,从右往左结合,*p++也就相当于*(p++),但是++本身的含义是先运算在+1,运算就是说p++作为一个整体与前面的*进行运算;增加1指的是p+1,所以实际上*p++符号整体对外表现的值是*p的值,运算完后p再加1。
【注意】是运算后p再加1,而不是p所指向的变量*p再加1
*++p
等同于 p += 1; *p;
++前置,指针先+1,然后取指针的值
#include <stdio.h>
int main(void)
{
int a[5] = {555, 444, 333, 222, 111};
int *p;
p = a;
// p = &a[0];
// p += 1;
//指针+1,表示指向下一格
// printf("*p++ = %d.\n", *p++); // 555
printf("*++p = %d.\n", *++p); // 444,++前置,指针先+1,然后取指针的值
// printf("(*p)++ = %d.\n", (*p)++); // 555,先计算(*p),然后对(*p)整体+1
// printf("++(*p) = %d.\n", ++(*p)); // 556,先*p取值,再前置++,该值+1后作为整个表达式的值
for (int i = 0; i < 5; i++){
printf("*p = %d.\n", *(p+i));
}
}
结果:
*++p = 444.
*p = 444.
*p = 333.
*p = 222.
*p = 111.
*p = 32766.
(*p)++
先计算(*p),然后对(*p)整体+1
#include <stdio.h>
int main(void)
{
int a[5] = {555, 444, 333, 222, 111};
int *p;
p = a;
// p = &a[0];
// p += 1;
//指针+1,表示指向下一格
// printf("*p++ = %d.\n", *p++); // 555
// printf("*++p = %d.\n", *++p); // 444,++前置,指针先+1,然后取指针的值
printf("(*p)++ = %d.\n", (*p)++); // 555,先计算(*p),然后对(*p)整体+1
// printf("++(*p) = %d.\n", ++(*p)); // 556,先*p取值,再前置++,该值+1后作为整个表达式的值
for (int i = 0; i < 5; i++){
printf("*p = %d.\n", *(p+i));
}
}
结果:
(*p)++ = 555.
*p = 556.
*p = 444.
*p = 333.
*p = 222.
*p = 111.
++(*p)
先*p取值,再前置++,该值+1后作为整个表达式的值
#include <stdio.h>
int main(void)
{
int a[5] = {555, 444, 333, 222, 111};
int *p;
p = a;
// p = &a[0];
// p += 1;
//指针+1,表示指向下一格
// printf("*p++ = %d.\n", *p++); // 555
// printf("*++p = %d.\n", *++p); // 444,++前置,指针先+1,然后取指针的值
// printf("(*p)++ = %d.\n", (*p)++); // 555,先计算(*p),然后对(*p)整体+1
printf("++(*p) = %d.\n", ++(*p)); // 556,先*p取值,再前置++,该值+1后作为整个表达式的值
for (int i = 0; i < 5; i++){
printf("*p = %d.\n", *(p+i));
}
}
结果:
++(*p) = 556.
*p = 556.
*p = 444.
*p = 333.
*p = 222.
*p = 111.