Jer*_*yal 3 c arrays string pointers
我最近在面试过程中遇到了这个问题.我需要一些帮助来理解这个程序的第二个输出背后的逻辑.
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出: - TEST sQuiz Z CQ
我从上面的代码中了解到:
为了简单起见,我们可以考虑cp[]{QUIZ TEST MCQ GeksQuiz}
第一个语句:
**++cpp- > cpp将指向它的基址TEST和解除引用2次给出TEST这是好的.
但在第二个陈述中,我无法揭开逻辑的神秘面纱:
*--*++cpp+3- > ++cpp指向MCQ *++cpp的地址M,--*++cpp将是之前的地址M,现在我被困在这里.它如何sQuiz作为输出?
(afaik ++(后缀)和*具有相同的优先级和从右到左的关联性)
(免责声明:请扩大您的想法.并非所有代码都用于产品开发.此代码评估对C指针的理解)
先是printf,cpp指着c+2.
CP
+------+
| |
0 | C+3 +----------------------------------------------------------------+
| | |
| | |
+------+ |
| | |
1 | C+2 +-------------------------------------------------+ |
CPP --------> | | | |
| | | |
+------+ | |
| +---------------------------------------+ | |
2 | C+1 | | | |
| | | | |
| | | | |
+------+ | | |
| +-----------------------+ | | |
3 | C | v v v v
| |
| | +-------------+------------+-----------+------------+
+------+ C | "GeksQuiz" | "MCQ" | "TEST" | "QUIZ" |
| | | | |
+-------------+------------+-----------+------------+
0 1 2 3
Run Code Online (Sandbox Code Playgroud)
第二printf,++cpp将cpp增加到c+1.
*++cpp将取消引用cpp并将给予c+1.
--将递减c+1的1,因此,*--*++cpp将最终放弃c.
c+3将指向第4 个字符"GeksQuiz",即s.
请注意,在第二个之后printf cpp将指向cp[0]哪个指向c现在.
+------+
| |
0 | C+3 +----------------------------------------------------------------+
| | |
| | |
+------+ |
| | |
1 | C+2 +-------------------------------------------------+ |
| | | |
| | | |
+------+ | |
| +-------------------------+ | |
2 | C | | | |
CPP -------->| | | | |
| | | | |
+------+ | | |
| +-----------------------+ | | |
3 | C | v v v v
| |
| | +-------------+------------+-----------+------------+
+------+ | "GeksQuiz" | "MCQ" | "TEST" | "QUIZ" |
| | | | |
+-------------+------------+-----------+------------+
0 1 2 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
562 次 |
| 最近记录: |