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

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

程序员文章站 2024-03-15 19:24:36
...
#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[]是一个指针数组,存放的不是字符串,而是各字符串首元素的地址。