请问这道题中使用*(p++)和 *(p + 1)的区别是什么?

如图,lc第13题,红框框出来的语句,为什么不可以写成 *(p++)或 *(++p)而必须是 *(p + 1)呢?例如写*(p++)会提示数组访问越界,哪位可以解答一下,谢谢!
2026年09月24日 10:17
有4个网友回答
网友(1):

根据问题描述,需要先理清++运算符的功能:

  1. ++运算符是+1的运算,但对于指针来说,就是p=p+1,这个时候p所指向的地址发生了1个偏移,并不会保留原来的地址指向。

  2. ++运算符有前置和后置两种使用方式,前置是先++后取值,后置是先取值后++。

针对上述问题描述,截图是在一条语句中多次使用++运算符,但是正常的方式是当所有的判断结束后,指针偏移一个地址,但是条件语句中,对指针p进行了多次地址偏移,所以会造成越界的问题。

最简单的做法是在判断的开始直接将*(p+1)的内容进行缓存,如 char tmp = *(p+1),这样不会多次重复使用*操作符。

网友(2):

引入一数组s[ ][ ],令p=s
p+1是数组s的第1行的首地址
*(p+1)则是数组s第1行第1列的元素的地址
*(p+1)+1则是数组s第1行的第1列的地址
*(*(p+1)+1)是取*(p+1)+1即s[1][1]所指向变量的值

网友(3):

++都包含了p=p+1这么个操作,也就是本来只想取p后面一个字符,现在两次p++就取到后面的后面了

网友(4):

sum=*(p+1)=='V' || *(p+1)=='X') ? sum-1:sum+1;

这句中如果改为*(p++), 当解析到第一个*(p++)时, p的指向已经向后移动一个位置, 当解析到第二个*(p++)时, p的指向根本不和第一个一致, 逻辑上就是错误的