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

#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[]是一个指针数组,存放的不是字符串,而是各字符串首元素的地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值