hello!!小伙伴们!马上要五一放假了,不知道大家还有没有好好学习呢,小左在火车上没事干,所以写了这篇博文,是我在做题的时候碰到的一个很有意思的关于数组指针的一些问题的题,涉及到了字符指针数组、指针数组、指针的运算,小左觉得是值得分享的,所以这就放到这里和大家一起探讨~~
它的问题是看一下这个代码到底会输出什么?下面先来看一下代码:
#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);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
不知道,聪明的你有答案了吗?有答案的小伙伴就不用往下看了,恭喜你,指针学的应该是很扎实呢!!要是还有什么疑惑问题的话,不妨看一下小左的思路?
首先把这个代码创建的内存画个图(可能有不规范的地方,是为了解题方便,还望担待喔~~)
图看明白了,下面看一下四个打印的过程分析:
- 第一个printf,cpp先自加变成1,即cpp的中存放的地址由cp变成了cp+1,再解引用两次,此时得到了字符串POINT
- 第二个printf,cpp先自加变成2,即cpp的中存放的地址由cp+1变成了cp+2,再解引用得到指向c+1的指针,此时给c+1自减得到c的地址,再解引用,此时得到了字符串ENTER的地址,是char*类型的,此时做指针的+3运算,指向ENTER中的第二个E再输出剩余字符串,即输出ER。
- 第三个printf,首先确认cpp此时的值为2,先[-2]得到了指向c+3的地址,再解引用此时指针指向字符串FIRST,此时做指针的+3运算,指向FIRST中的S输出剩余字符串,即输出ST。
- 第四个printf,首先确认cpp在第三次没有对自身做运算,此时它的值还是2。此时做第一个[-1],得到cp+1再解引用,得到的是指向指向c+2的指针,再做一次[-1],得到c+1再解引用,得到指向字符串NEW的指针,此时做指针的+1运算,指向NEW中的E再输出剩余字符串,即输出EW。
最后把打印的结果附在这里,有不同编译环境的小伙伴可复制代码去亲自验证!
好了,今天的分享到这里就结束了,我第一次做这个题的时候只能做出来第一个Printf,后面完全是懵的,后来才慢慢摸索会,所以有哪里说的不对欢迎小伙伴们评论区指正~大家一起进步!!!下次见!