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

C语言指针增减运算(*--*++p)代码运行结果解析求助

代码运行逻辑拆解

先把代码重新整理如下:

#include <stdio.h>

int main() {
 
    static char*s[]  = {"6642321","93456","134098","55513"};
    char ** str[] = {s+3,s+2,s+1,s};
    char ***p = str;
    **++p;
    printf("%s\n",*--*++p+2);
    return 0;
}

第一步:明确各变量的初始状态

  • s是char*类型数组,存储4个字符串指针:
    • s[0] = "6642321",s[1] = "93456",s[2] = "134098",s[3] = "55513"
  • str是char**类型数组,存储4个指向s元素的指针:
    • str[0] = s+3(指向s[3]),str[1] = s+2(指向s[2]),str[2] = s+1(指向s[1]),str[3] = s(指向s[0])
  • p是char***类型指针,初始指向str的首元素str[0]

第二步:执行**++p;

这行代码的核心是++p,后面的**仅读取值,不修改任何变量:

  1. ++p:p从指向str[0]自增为指向str[1]
  2. *p:取str[1]的值,即s+2(指向s[2])
  3. **p:取s[2]指向的字符串首字符'1',无实际修改作用
    执行后,p的位置是指向str[1]

第三步:执行printf("%s\n",*--*++p+2);

单目运算符++/--/*优先级相同,结合性为自右向左,运算顺序如下:

  1. ++p:p当前指向str[1],自增后指向str[2]
  2. *++p:取str[2]的值,即s+1(这是一个char**类型指针,指向s[1])
  3. --*++p:对s+1这个指针执行自减操作,得到s(指向s[0])——这里操作的是str[2]存储的指针值,不是数组名s,完全合法,不会触发编译错误
  4. *--*++p:取s指向的元素,即s[0](指向字符串"6642321")
  5. *--*++p+2:将s[0]指针向后偏移2位,指向字符串"6642321"的第3个字符'4'

最终printf输出从'4'开始的字符串,即42321

对误解的纠正

你认为--(s+1)会触发编译错误,但实际上:

  • *++p取出的是str[2]中存储的指针值s+1(这是一个可修改的指针变量,不是数组名s)
  • 对这个指针变量执行--操作是合法的,数组名s本身是不可修改的左值,但这里操作的是存储在str数组里的指针副本,和数组名s无关

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:38:16