社区新版论坛已上线,点击立即前往!使用 openKylin 账户授权登录,解锁更多体验!

openKylin论坛

 找回密码

一道笔试指针题目详解 [复制链接]

本帖最后由 liuxing 于 2013-5-10 17:23 编辑

本题来源自<The C Puzzle Book> ,直接看题吧
#include <stdio.h>
char *c[]={"ENTNG", "NST","AMAZI","FIRBE"};
char** cp[]={c+3, c+2, c+1, c};
char ***cpp= cp;
int main() {
    printf("%s",**++cpp);
    printf("%s ",*--*++cpp+3);
    printf("%s",*cpp[-2]+3);
    printf("%s",cpp[-1][-1]+1);
}

亲们 给出你们的答案  ,先不要下面的看分析
请写出程序的执行结果....


首先从左到右看:
char *c[]= {              "ENTNG",               "NST",              "AMAZI",              "FIRBE"            };

*c[] 是一个字符,因此,c[]是指向该字符,c就是一个数组(数组的内容为指向字符的指针),c已经被初始化了.
char** cp[]={c+3, c+2, c+1, c};

再看第二行,**cp[]是一个字符,*cp[]就是一个指针,指向该字符,cp[]就是一个指针,指向该指针,而cp就成为了指针数组,内容是指向字符的指针的指针。并且通过c的元素进行了初始化
char ***cpp= cp;

第三行,***cpp是一个字符,**cpp指向该字符,*cpp指向该指针,cpp就指向该字符的指针的指针.
然后我画一张图表示初始的情况看看

然后对于下面的输出语句,通过操作符优先级使用括号来区分一下:
*(*(++cpp));

这个嘛,就是把cpp后移(注意cpp已经改变了)然后就指向了cp[1],然后两次取其值即可得到AMAZI
推导过程如下:
++cpp -> cp[1]       // cp[1] -> c+2++cpp = &cp[1]       // &(c+2)*++cpp = *(&c+2)     //  c[2]**++cpp = *&c[2]

然后看第二个
(*(--(*(++cpp))))+3;

加括号后如上,cpp再加一,就指向了cp[2],取一次值(也就是*号)就变成了c[1],然后--c[1]就指向了c[0],取值就成了c[0]的地址,然后地址+3,就是NG了
(*(cpp[-2]))+3;

上面,cpp指向cp[2]了,然后呢,cpp[-2] 相当于*(cpp-2),间接引用cp[2],这样cpp[-2]就指向了cp[0]了,然后,就是FIRBE了,加3就是BE了
最后
(cpp[-1][-1])+1;
cpp还是之前的cp[2],cpp[-1][-1]相当于*(*(cpp-1)-1),先减1指向了cp[1],取一次值就是c[2]了,然后c[2]-1就成为c[1]了,然后+1之后就是ST了.
所以,最后输出就是

AMAZING BEST

(注意有个空格额)
这道考察大家对指针的理解
指针也是个变量,变量当然有类型(注意 type 此处只是说明原理而已)。
type test = value;
type * ptest = &test;
*ptest 间接访问 test的值 value
ptest +n 表示 &test + n * sizeof(type)
当然了 ptest + n 表示地址可能是其他进程或者其他,  *(ptest + n) 间接访问 可能报非法访问。

楼主
发表于 2013-5-10 16:56:57
回复

使用道具 举报

一道笔试指针题目详解 [复制链接]

{:7_141:}
沙发
发表于 2013-5-10 17:10:09
回复

使用道具 举报

一道笔试指针题目详解 [复制链接]

zzz 发表于 2013-5-10 17:10

只是考察指针理解,多级指针完全可以用typdef 去别名,让大家更加好理解
板凳
 楼主| 发表于 2013-5-10 17:19:45
回复

使用道具 举报

一道笔试指针题目详解 [复制链接]

这道题目给我的唯一感觉:C 语言必须马上被淘汰,这些操作应该交给计算机去做,计算机擅长做这些,而程序员应该把注意力放在程序逻辑和需求设计上,这才是人类该干的事。{:7_138:}
地板
发表于 2013-5-10 19:51:46
回复

使用道具 举报

一道笔试指针题目详解 [复制链接]

其实我更愿意相信,只有我大天朝才会把这些东西搬出来教育,不以为耻,反以为荣!
5#
发表于 2013-5-17 09:42:23
回复

使用道具 举报

一道笔试指针题目详解 [复制链接]

zubuntu 发表于 2013-5-17 09:42
其实我更愿意相信,只有我大天朝才会把这些东西搬出来教育,不以为耻,反以为荣!

你错了,底层实现需要这些东西。
6#
 楼主| 发表于 2013-5-17 11:21:11
回复

使用道具 举报

openKylin

GMT+8, 2024-6-15 10:13 , Processed in 0.021566 second(s), 17 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表