欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

金山笔试题解析

程序员文章站 2024-03-15 20:17:00
...
代码:
#include<stdio.h>
#include<stdlib.h>
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);
    system("pause");
    return 0;
}


解析:
优先级:后缀自增>后缀自减>前缀自增>前缀自减>间接访问

char ***cpp = cp;
    把数组cp的首元素地址赋给了三级指针cpp

printf("%s\n", **++cpp);
     ++cpp——cpp就指向第二个char***++cpp访问到第二个char**的空间,
     **++cpp访问到char*的空间,即得到char*空间的内容————字符串“POINT"首元素的地址,所以输出————POINT.

printf("%s\n", *--*++cpp+3);
     ++cpp使cpp指向第三个char***++cpp访问到第三个char**的空间,而第三个char**指向第二个char*,
     --*++cpp使得访问到第一个char*,在对它解引用(*--*++cpp),获得第一个char*空间的内容——字符串“ENTER”首元素的地址,*--*++cpp+3,使得输出————ER

printf("%s\n", *cpp[-2]+3);
     *cpp[-2]=**(cpp-2)。
     cpp-2使得访问到第一个char**,但是,cpp得自身(指向)没有变,还是指向第三个char***(cpp-2)访问到第一个char**的空间,而第一个char**指向最后一个char*,
     **(cpp-2)访问到char*的空间,得到char*空间的内容————字符串“FIRST"首元素的地址,*cpp[-2]+3,使得输出————ST

printf("%s\n", cpp[-1][-1]+1);
     cpp[-1]=*(cpp-1)。
     cpp-1使得访问到第二个char**,
     cpp[-1],访问到第二个char**的空间,而第二个char**指向第三个char*,
     cpp[-1][-1]访问到第二个char*的空间,并得到它的内容————字符串“NEW”首元素的地址,cpp[-1][-1]+1,使得输出————EW

结果:
金山笔试题解析

金山笔试题解析
优先级:后缀自增>后缀自减>前缀自增>前缀自减>间接访问