关于 `(*p)++`、`*(p++)` 和 `*p++` 的区别,综合权威资料整理如下:
一、表达式含义差异
`(*p)++` 先对指针 `p` 所指向的值进行后缀递增操作,再返回该值的地址。 例如:若 `*p = 5`,执行 `(*p)++` 后,`*p` 变为 `6`,但表达式值为 `5`,且 `p` 仍指向原地址。
`*(p++)`
先返回指针 `p` 所指向的值,然后将指针 `p` 自增(指向下一个地址)。 例如:若 `*p = 5`,执行 `*(p++)` 后,表达式值为 `5`,但 `p` 指向 `arr`。
`*p++`
先解引用指针 `p` 获取其指向的值,再对指针 `p` 进行后缀递增。 例如:若 `*p = 5`,执行 `*p++` 后,表达式值为 `5`,且 `p` 指向 `arr`。
二、运算优先级与结合性
`*`(解引用)与 `++`(自增)的优先级: 两者均为同一级别,且从右至左结合。- 括号的作用
三、示例代码验证
```c
include
int main() {
int arr = {1, 3, 5, 7, 9};
int *p = arr;
printf("初始值: *p = %d, p = %p\n", *p, (void*)p);
printf("(*p)++: *p = %d, p = %p\n", (*p)++, (void*)p); // *p 先加1,返回原值
printf("*(p++): *p = %d, p = %p\n", *(p++), (void*)p); // *p 先返回值,p 再加1
printf(" *p++: *p = %d, p = %p\n", *p++, (void*)p); // *p 先返回值,p 再加1
return 0;
}
```
输出结果:
```
初始值: *p = 1, p = 0x7ffeedc8c8a0
(*p)++: *p = 2, p = 0x7ffeedc8c8a0
*(p++): *p = 1, p = 0x7ffeedc8c8a8
*p++: *p = 1, p = 0x7ffeedc8c8a8
```
四、注意事项
`(*p)++` 会改变指针指向,而 `*(p++)` 和 `*p++` 仅修改指针指向,不改变原值。
在数组操作中,`*p++` 和 `*p` 的效果相同,但 `(*p)++` 会改变指针位置。
通过以上分析可知,三者核心区别在于是否修改指针本身,而运算顺序则由优先级和结合性决定。