您的位置:首页 > 其它

金山笔试题解析(经典指针)

2017-09-10 19:45 288 查看
#include<stdio.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);//POINT
printf("%s\n",*--*++cpp+3);//ER
printf("%s\n",*cpp[-2]+3);//ST
printf("%s\n",cpp[-1][-1]+1);//EW
return 0;
}




在该题中, c是一个指针数组,用来存放的是对应字符串首元素的地址,正如图中标示的那样,char **cp 是一个二级指针,将c+3的地址赋给cp的第一个空间,c+2的地址赋给cp的第二个空间,c+1的地址赋给cp的第三块空间,c赋给cp的最后一个空间,char ***cpp是一个三级指针, 用来存放二级指针cp 的地址。



(1)解析printf(“%s\n”,**++cpp);//POINT

cpp指向cp,代表cp首元素的地址,++cpp相当于cp的首地址+1,指向cp的第二块空间,++cpp相当于将++cpp 再通过解引用()操作,找到其中存放地址的空间(图中的粉色区域),**++cpp是再对这块空间解引用,找到该空间所存的内容,故而:

程序运行结果为POINT

(2)解析printf(“%s\n”,–++cpp+3);//ER

在上一问中,cpp指向cp中第二块空间(cp中的粉色区域),++cpp指向cp中的第三块空间(cp中绿色区域),++cpp找到c中的第二块空间,– ++cpp是指c中的起始空间,–++cpp找到c中起始空间的内容,即E字符的地址,printf(“%s\n”,–++cpp+3);意思是:在屏幕上输出从E字符向后数三个字符开始的字符串,故而:

程序运行结果为:ER

(3)解析 printf(“%s\n”,*cpp[-2]+3);//ST

在第二问的基础上,此时,cpp指向的是cp中第三块空间(cp中绿色区域),cpp[-2]相当于cp的第一块空间(cp中黄色区域),*cpp[-2]找到c中最后一块konhjian (c中蓝色区域),此时该空间存放的是“FIRST”中”F”的地址,printf(“%s\n”,*cpp[-2]+3);意思是:在屏幕上显示从”F”向后数三个字符开始的字符串,故而:

程序运行结果为:ST

(4)解析printf(“%s\n”,cpp[-1][-1]+1);//EW

在完成(3)后,cpp[-1][-1]指向c中第二块空间,其中原本存放”NEW“中”N“字符的地址,printf(“%s\n”,cpp[-1][-1]+1);在屏幕上显示:从”N“向后数一个字符开始的字符串,故而:

程序运行结果为:EW

总结:在该题中,值得注意的是,(1)每次cpp的指向与上一次输出有关系,故而,若没把cpp的位置指向弄清楚,便会出现一步错,步步错的残局,(2),char* c[]是一个指针数组,存放的不是字符串,而是各字符串首元素的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: