was 发表于 2015-3-25 17:55:56

变态指针题目,求大神解

char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
        char **cp[] = {c+3, c+2, c+1, c};
        char ***cpp = cp;

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

请问:输出啥内容。
有没有类似的一本书,或者类似讲指针的文章,讲解。这类题目不好做。

仰望天上的光 发表于 2015-3-25 20:34:19

从形式上看, c等价于*(c+a)---这个很重要,下面的推到将称这个为公式
(1)printf("%s\n", cpp + 2);中,cpp,就是cp,也就是c+1,所以cpp就是(c+1),带入公式,就是*(c+1+1),就是*(c+2),也就是c,也就是"POINT",后面的+2自己明白吧
( 2 ) printf("%s\n", **++cpp);这里cpp自增1,++cpp相当于cp+1,**++cpp相当于**(cp+1),代入公式,相当于*cp,也就是*(c+2),再次代入公式,得到c,就是"POINT"
(3)printf("%s\n",--*++cpp+ 3);前题cpp已经自增1,这题又增1,所以++cpp相当于cp+2,所以
*++cpp就是*(cp+2),代入公式,就是cp,就是c+1,--*++cpp 就是--(c+1),就是c;--*++cpp 就是*c;
也就是*(c+0),就是c,也就是"ENTER",最后的+3自己看着办

(4) printf("%s\n", cpp + 3);由于前面cpp自增了两次(注意,--并不作用在cpp上),所以现在的cpp就是cp+2;cpp就是(cp+2),代入公式,就是*((cp+2)+1),就是*(cp+3).就是cp,也就是c;
所以,cpp就是c,也就是"FIRST",最后的+3自己处理

haiouda 发表于 2015-3-25 22:30:32

仰望天上的光 发表于 2015-3-25 20:34
从形式上看, c等价于*(c+a)---这个很重要,下面的推到将称这个为公式
(1)printf("%s\n", cpp...

学习了,版主好强 {:5_110:}

was 发表于 2015-3-27 15:07:15

仰望天上的光 发表于 2015-3-25 20:34
从形式上看, c等价于*(c+a)---这个很重要,下面的推到将称这个为公式
(1)printf("%s\n", cpp...

谢谢。威武霸气。
页: [1]
查看完整版本: 变态指针题目,求大神解