逻辑应用于指向字符串数组的指针

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指针的理解)

hac*_*cks 5

先是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,++cppcpp增加到c+1.
*++cpp将取消引用cpp并将给予c+1.
--将递减c+11,因此,*--*++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)

  • @haccks但是你的第二个图表中仍然有一个"c + 1" - 不应该是`c`而是吗? (2认同)