c 中的指针递增和递减(*--*++p)

问题描述 投票:0回答:1
#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
。为什么我会得到这个答案。请问谁能解释一下这段代码吗?

c increment decrement
1个回答
0
投票

一元间接运算符

*
的结果始终是左值。这意味着它引用了一个可以分配给的对象。

在这种情况下,

++p
中的子表达式
printf
是指向
str[2]
的指针。因此
*++p
为您提供了 object
str[2]
,其具有
s+1

这意味着

--*++p
相当于
--str[2]
,后者又将其值设置为
s+0
(即指针衰减后的
s
)。取消引用
*--*++p+2
会得到对象
s[0]
。然后将 2 添加到存储在那里的值,即指向字符串
"6642321"
开头的指针,从而得到指向该字符串的第三个字符的指针。该指针被传递给
printf
,然后打印
42321

© www.soinside.com 2019 - 2024. All rights reserved.