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

关于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个位置,而非你认为的两个。

正确执行流程

  1. while循环结束:ps指向字符串末尾的'\0'
  2. for循环初始化:ps-- → ps指向'z',调用puts(ps)输出z
  3. 第一轮循环结束:ps-- → ps指向'y',满足ps-str>=0,输出yz
  4. 第二轮循环结束:ps-- → ps指向'x',满足条件,输出xyz
  5. 第三轮循环结束:ps-- → ps超出数组起始位置,ps-str=-1,不满足条件,循环终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:38:26