为何p+1与p++在该场景效果不同?版本1正常版本2失效原因
为什么版本1用
p++正常,版本2用p+1失效? 首先得搞懂p++和p+1的核心区别:
p++是后置自增操作:先返回p当前的地址,再把p本身的指向往后移1位(指向内存中下一个字符),是会修改p的。p+1是地址偏移计算:只会算出p往后挪1位的新地址,但完全不会改变p本身的指向,相当于只是算个数,没动原指针。
结合提取扩展名的函数逻辑来看:
假设函数的核心流程是:
- 遍历文件名,让指针
p定位到最后一个.的位置(找不到就给extension存空串)。 - 通过第二个循环,把
.后面的字符复制到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
相关产品推荐
相关产品推荐

