金山笔试题解析(经典指针)
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[]是一个指针数组,存放的不是字符串,而是各字符串首元素的地址。
相关文章推荐
- 100道经典Hadoop常见面试/笔试题及答案解析
- java经典笔试题目解析(下)
- 100道经典Hadoop常见面试/笔试题及答案解析
- C/C++笔试系列--经典C++笔试题解析1
- 括号匹配问题与经典笔试面试题目解析
- iOS 最详细的解析(数组与指针)笔试题
- 指针的笔试面试经典题目
- C经典 一维数组指针解析
- C/C++指针的经典笔试面试题
- C/C++笔试系列--经典C++笔试题解析3
- C/C++笔试系列--经典C++笔试题解析6
- ZigZag排列问题与经典笔试面试题目解析
- ZigZag排列问题与经典笔试面试题目解析
- 经典问题解析(1)---const和引用、指针与引用、函数重载、C方式编译
- C/C++笔试系列--经典C++笔试题解析5
- 经典C++笔试题解析3
- 100道经典Hadoop常见面试/笔试题及答案解析
- 100道经典Hadoop常见面试/笔试题及答案解析
- 经典C++笔试题解析4
- iOS 数组与指针经典笔试题