#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;
}
在 printf 语句的这段代码中
*++p
给出一个地址(s+1)。据我了解,--(s+1)
给出了编译错误。但这段代码的输出为 42321
。为什么我会得到这个答案。请问谁能解释一下这段代码吗?
一元间接运算符
*
的结果始终是左值。这意味着它引用了一个可以分配给的对象。
在这种情况下,
++p
中的子表达式printf
是指向str[2]
的指针。因此 *++p
为您提供了 object str[2]
,其具有 值 s+1
。
这意味着
--*++p
相当于 --str[2]
,后者又将其值设置为 s+0
(即指针衰减后的 s
)。取消引用 *--*++p+2
会得到对象 s[0]
。然后将 2 添加到存储在那里的值,即指向字符串 "6642321"
开头的指针,从而得到指向该字符串的第三个字符的指针。该指针被传递给 printf
,然后打印 42321
。