You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何p+1与p++在该场景效果不同?版本1正常版本2失效原因

为什么版本1用p++正常,版本2用p+1失效?

首先得搞懂p++和p+1的核心区别:

  • p++是后置自增操作:先返回p当前的地址,再把p本身的指向往后移1位(指向内存中下一个字符),是会修改p的。
  • p+1是地址偏移计算:只会算出p往后挪1位的新地址,但完全不会改变p本身的指向,相当于只是算个数,没动原指针。

结合提取扩展名的函数逻辑来看:
假设函数的核心流程是:

  1. 遍历文件名,让指针p定位到最后一个.的位置(找不到就给extension存空串)。
  2. 通过第二个循环,把.后面的字符复制到extension中。

版本1(p++)的正确逻辑

比如第二个循环开头写的是for(p++; *p != '\0'; p++):
这里的p++直接把p从.的位置,挪到了扩展名的第一个字符(比如test.txt里的t),之后循环复制的都是扩展名的有效内容,自然能正确提取出txt。

版本2(p+1)的错误原因

如果第二个循环开头写的是for(p+1; *p != '\0'; p++):
p+1只是算了个新地址,但p本身还是指着.的位置。循环一开始复制的是*p也就是.,后续才会往后挪,最终得到的是.txt而不是txt;如果文件名没有扩展名,p可能指向字符串末尾,p+1会导致越界访问,直接触发错误。

哪怕你想基于p+1的地址开始复制,也得把这个地址赋值给某个指针(比如char *q = p+1)再循环,直接写p+1作为循环初始化是完全无效的,因为它没修改任何变量的状态。

内容的提问来源于stack exchange,提问作者Dylan Girrens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:54:58