美文网首页
经典笔试题:一级指针数组、二级指针数组和三级指针的联合使用详解

经典笔试题:一级指针数组、二级指针数组和三级指针的联合使用详解

作者: taobao | 来源:发表于2021-07-19 08:41 被阅读0次

    摘抄自:https://blog.csdn.net/w_y_x_y/article/details/78572236
    题目代码如下:

    int main()
    {
        char *c[]={"ENTER","NEW","POINT","FIRST"};
        char **cp[]={c+3,c+2,c+1,c};
        char ***cpp=cp;
    
        printf("%s\n",**++cpp);
        printf("%s\n",*--*++cpp+3);
        printf("%s\n",*cpp[-2]+3);
        printf("%s\n",cpp[-1][-1]+1);
    
        return 0;
    }
    

    输出结果如下:


    这里写图片描述

    我们来一步步解析代码:

    char *c[] = {"ENTER","NEW","POINT","FIRST"};
    

    这是一个“指针”数组,每个元素存的是每个字符串的首字符的地址
    如图:


    这里写图片描述
    char **cp[] = {c+3,c+2,c+1,c};
    

    这是一个“二级指针”数组,每个元素存的是“指针”数组c 的每个空间的地址
    如图:


    这里写图片描述
    char ***cpp = cp;
    

    这是一个三级指针,指向“二级指针”数组cp的首地址
    如图:


    这里写图片描述
    printf("%s\n", **++cpp);
    

    首先来解析这段代码:

    **++cpp         //分解成下面几步
    
    ++cpp           //cpp自增一,如下图
    *(++cpp)        //cpp指向cp[1]的空间,取cp[1]内的元素,即c+2。
    *(*(++cpp))     //对其解引用,取到"POINT"的首字符地址
                    //所以结果输出"POINT"
    
    这里写图片描述

    继续看下条代码:

    printf("%s\n", *--*++cpp+3);
    

    仍然先解析代码:

    *--*++cpp+3         //分解成下面几步
    
    ++cpp               //cpp自增一,如下图
    *(++cpp)            //对自增后的cpp解引用,取到c+1,即c[1]的地址
    --(*(++cpp))        //对c+1自减一,取到c[0]的地址
    *(--(*(++cpp)))     //对其解引用,取到"ENTER"的首字符地址
    *(--(*(++cpp)))+3   //将"ENTER"的首字符地址+3,得到字符'E'的地址
                        //所以结果输出"ER"
    
    这里写图片描述

    继续看下条代码:

    printf("%s\n", *cpp[-2]+3);
    

    解析代码:

    *cpp[-2]+3          //分解成下面几步
    
    cpp[-2]    //相当于*(cpp-2),其代表的地址下如图,取到c+3,即c[3]的地址
    *(cpp[-2])     //对其解引用,即*(c+3),取到字符串"FIRST"首字符的地址
    *(cpp[-2])+3        //指向字符串"FIRST"中的字符'S'的地址
                        //所以输出"ST"
    
    
    这里写图片描述

    继续看下一条代码:

    printf("%s\n", cpp[-1][-1]+1);
    

    解析代码:

    cpp[-1][-1]+1       //分成下面几步
    
    cpp[-1]             //相当于*(cpp-1),其代表地址如下图,取到c+2
    (cpp[-1])[-1]       //相当于(c+2)[-1],相当于*((c+2)-1)
                        //取到字符串"NEW"首字符的地址
                        //其代表地址如下图
    (cpp[-1])[-1]+1     //指向字符串"NEW"中字符'E'的地址
                        //所以输出"EW"
    
    image.png

    相关文章

      网友评论

          本文标题:经典笔试题:一级指针数组、二级指针数组和三级指针的联合使用详解

          本文链接:https://www.haomeiwen.com/subject/txlyrktx.html