在C语言中,表达式 `*p++` 的含义和执行顺序如下:
一、表达式解析
运算符优先级 - `*`(解引用)和 `++`(自增)属于同一优先级操作符,且遵循 从右向左
的结合性。
- 因此,`*p++` 等价于 `* (p++)`,即先计算 `p++`,再对结果进行解引用。
执行顺序 - 首先计算 `p++`,此时会先取出 `*p` 的值,然后 `p` 自增1,指向下一个内存地址。
- 然后对 `*p`(即原值)进行解引用,但解引用后的值未被使用(因为表达式整体未赋值)。
二、示例说明
```c
include
int main() {
int a = {10, 20, 30, 40, 50};
int *p = a; // p指向a
printf("初始值: *p = %d, p = %d\n", *p, (int)p); // 输出: 10 0
*p++ = 100; // 等价于 * (p++) = 100
printf("执行后: *p = %d, p = %d\n", *p, (int)p); // 输出: 100 1
return 0;
}
```
初始状态:
`*p = 10`,`p = 0`(指向数组第一个元素)。
执行 `*p++ = 100`
1. 取出 `*p` 的值 `10`,`p` 自增为 `1`(指向 `a`)。
2. 将 `100` 赋值给 `*p`(即 `a`),但表达式整体未改变 `p` 的值。
最终结果:`*p = 100`,`p = 1`。
三、与 `(*p)++` 的区别
`*p++`:先取值后自增,值不变,指针移动。
`(*p)++`:先对 `*p` 的值自增,再取值。
示例对比:
```c
include
int main() {
int a = {10, 20, 30, 40, 50};
int *p = a;
printf("初始值: *p = %d, p = %d\n", *p, (int)p); // 10 0
*p++ = 100; // * (p++) = 100
printf("执行后: *p = %d, p = %d\n", *p, (int)p); // 100 1
(*p)++ = 200; // 先自增再取值
printf("再次执行后: *p = %d, p = %d\n", *p, (int)p); // 200 2
return 0;
}
```
第二次执行 `(*p)++ = 200`:
1. 先将 `*p`(100)自增为 `101`。
2. 然后取值 `101` 赋给 `*p`,此时 `*p = 101`,`p = 2`。
四、总结
`*p++` 的核心是 先取值后自增,等价于 `* (p++)`,但表达式本身不改变指针位置。
若需同时获取自增后的值,需使用临时变量,例如 `int temp = *p++;`。