【发布时间】:2015-04-09 19:31:38
【问题描述】:
我最近在面试过程中遇到了这个问题。 我需要一些帮助来理解这个程序的第二个输出背后的逻辑。
#include <stdio.h>
char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;
int main()
{
printf("%s ", **++cpp); //1st statement
printf("%s ", *--*++cpp+3); //2nd statement
printf("%s ", *cpp[-2]+3); //3rd statement
printf("%s ", cpp[-1][-1]+1); //4th statement
return 0;
}
输出:- TEST sQuiz Z CQ
我从上面的代码中了解到:
为了简单起见,我们可以将 cp[] 视为 {QUIZ TEST MCQ GeksQuiz}
第一条语句:**++cpp -> cpp 将指向TEST 的基地址,并且将其取消引用两次得到TEST,这很好。
但在第二条语句中我无法揭开逻辑的神秘面纱:*--*++cpp+3 -> ++cpp 指向 MCQ *++cpp 将是 M 的地址,--*++cpp 将是以前的地址到M,现在我被困在这里。它是如何将sQuiz 作为输出的?
(afaik ++(后缀)和 * 具有相同的优先级和从右到左的关联性)
(免责声明:请开阔思路。并非所有代码都用于产品开发。此代码评估对 C 指针的理解)
【问题讨论】:
-
版主备注我已经清除了cmets,如果你觉得有必要继续跑题,请带它去聊天。