一道面试题教你轻松玩转C++指针

提到指针,真是让人头皮发麻,今天笔者来带你玩转指针。

话不多说先看这道面试题 (注意细节)

int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}

是不是看着看着就迷糊了,没关系,咱们画图来谈个究竟。

334AEF41-2D9B-DB11-FD13-978EA79CF462.png

这样一来看起来是不是明显多了,但还是要仔细分析才能保证万无一失。

第一次打印

先进行++p再进行两次解引用.见下图可知我们打印 POINT

697C65C6-D738-9C24-FDED-F20E2E2B4997.png

 第二次打印

先进行 ++CPP 然后解引用 再进行 -- 操作将C+1改变为C接着再一次解引用 最后+3

我们这里打印结果是 ER

A4B7C927-69D4-E5AF-62AB-F733EC6C01E6.png

 第三次打印

我们先进行CPP[-2]的操作,即相当于*(CPP-2)但也要注意这里我们CPP的值并未发生改变

在这里我们(CPP-2)的指向用黑线表示,然后再一次解引用,最后+3,此时指向了图中ST

所以我们这里打印ST

47E21594-5B4D-FA5F-A68B-F6BC831E3A4C.png

 第四次打印

CPP[-1]即 *(CPP-1)这里的CPP[-1][-1]即相当于*( *(CPP-1)-1) 最后+1指向EW

41635884-B881-41C9-CAB8-6D342035CF2C.png

最后我们运行程序来看看结果

B1CD0550-43B3-3CE5-621D-8CA425A309CF.png

如果答对了,那么恭喜你,你已经把指针拿捏了。

如果没有答对,那么也不要气馁,再多看看分析,相信你一定行。

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据