关于C指针的理解误区:字符串遍历代码执行结果疑问
C语言代码执行结果的理解误区
待分析代码
#include<stdio.h> int main() { char str[]="xyz",*ps=str; while(*ps) ps++; for(ps--;ps-str>=0;ps--) puts(ps); return 0; }
正确执行结果
z yz xyz
你的理解逻辑
执行while(*ps) ps++;后,认为*ps指向数组的最后一个元素;执行for(ps--;ps-str>=0;ps--)puts(ps);时,认为*ps每次回退两个位置,因此你认为结果应该是:
z xyz
理解中的错误点
while循环后的指针指向错误:
字符串"xyz"在内存中实际存储为'x'、'y'、'z'、'\0'(末尾隐含字符串结束符)。while(*ps)的判断条件是*ps不为0,所以会持续让ps后移,直到ps指向末尾的'\0'才停止,而非指向最后一个有效字符'z'。for循环的指针步长理解错误:
for循环的结构是初始化; 条件判断; 循环后操作。这里初始化阶段ps--是把指向'\0'的指针回退1步到'z';之后每轮循环结束后只会执行1次ps--,也就是指针每次只回退1个位置,而非你认为的两个。
正确执行流程
- while循环结束:
ps指向字符串末尾的'\0' - for循环初始化:
ps--→ps指向'z',调用puts(ps)输出z - 第一轮循环结束:
ps--→ps指向'y',满足ps-str>=0,输出yz - 第二轮循环结束:
ps--→ps指向'x',满足条件,输出xyz - 第三轮循环结束:
ps--→ps超出数组起始位置,ps-str=-1,不满足条件,循环终止
内容的提问来源于stack exchange,提问作者Levis
相关产品推荐
相关产品推荐

