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,后面的**仅读取值,不修改任何变量:
++p:p从指向str[0]自增为指向str[1]*p:取str[1]的值,即s+2(指向s[2])**p:取s[2]指向的字符串首字符'1',无实际修改作用
执行后,p的位置是指向str[1]
第三步:执行printf("%s\n",*--*++p+2);
单目运算符++/--/*优先级相同,结合性为自右向左,运算顺序如下:
++p:p当前指向str[1],自增后指向str[2]*++p:取str[2]的值,即s+1(这是一个char**类型指针,指向s[1])--*++p:对s+1这个指针执行自减操作,得到s(指向s[0])——这里操作的是str[2]存储的指针值,不是数组名s,完全合法,不会触发编译错误*--*++p:取s指向的元素,即s[0](指向字符串"6642321")*--*++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
相关产品推荐
相关产品推荐

