佛山企业网站优化,优秀国外设计网站,室内设计效果图客厅,网站模版建站之前一个读者给我发的一个题目#xff0c;我大概看了下#xff0c;题目的难度还是比较大的#xff0c;而且考察的内容也比较多#xff0c;可能在实际项目上使用比较少#xff0c;估计十几年的老码农都没有用过#xff0c;但是在看大神的代码的时候#xff0c;就特别考验… 之前一个读者给我发的一个题目我大概看了下题目的难度还是比较大的而且考察的内容也比较多可能在实际项目上使用比较少估计十几年的老码农都没有用过但是在看大神的代码的时候就特别考验基本功能不能理解理解别人的代码非常重要。题目如下就直接printf出几个的输出值比较自信的大神可以直接回复答案可以看看自己的答案对不对。#include stdio.h char *c[] {HELLO,NEW,WORLD,SAYHI};
char **cp[]{c3,c2,c1,c};
char ***cppcp; int main(void)
{ printf(%s\n,*cpp[2]); printf(%s\n,**cpp); printf(%s\n,*--*cpp3); printf(%s\n,**cpp); printf(%s\n,*cpp[-2]3); printf(%s\n,cpp[-1][-1]1); printf(%s\n,cpp[-1]);
}图示解析解题过程c 是一个数组数组里面存的东西是 char * 类型 cp 也是一个数组数组里面存的东西是 char **, 类型 cpp 是一个指针cpp 是一个三级指针三级指针只能存二级指针地址我用 gdb 调试如下从 gdb 调试可以看到 cpp 存的是一个地址这个地址就是 cp 也就是 0x601060cp 是数组里面的数组存的是 char ** 如果我们想拿到 char * 的字符串就需要使用 *p[x] 来获取里面的字符串比如几个printf 的输出结果1、printf(%s\n,*cpp[2]);实际上获取的就是 c2 也就是 NEW 字符串2、printf(%s\n,**cpp);** cpp 是先取cpp 移动到下一个位置然后再取值cpp移动多少位置呢是sizeof(char ***)的大小cpp 移动 到下一个就是 c2 所以 *cpp 就是 WORLD3、printf(%s\n,*--*cpp3);这个就慢慢的显得难度上来了看这个东西总觉得怪怪的我们还是分解一下 首先 cpp cpp 是三级指针 所以 *cpp 就是获取二级指针的值因为之前已经对 cpp做了 运算所以现在cpp 指向的是 cp[1]现在又对cpp 做运算所以 cpp就指向了 cp[2]了--cpp 可以理解是对指针做运算移动的值就是 sizeof (char *** ) 。-- * cpp 就是*cpp - sizeof(char ***) 也就是 cp[2] - 8这个操作之后实际上就是 cp[3]了前面再加上一个 就是cp[3]了cp[3] 3 就是便宜3个值也就是 LO 字符串了。4、printf(%s\n,**cpp);这个输出 HELLO 应该没有任何问题吧原来题目没有这个打印的我是为了调试而已。5、printf(%s\n,*cpp[-2]3);这个也是一个超级让我们奇怪的表达式我们可以主要看这个cpp[-2] cpp[-2] 可以这样理解 cpp - 2*sizeof(char ***) cpp - 2*8 cpp -16我们先理一下前面的运算现在cpp在哪个位置这个很关键我们之前对cpp 进行了两次 次操作现在cpp 应该指向 cp[2]才对使用gdb验证试一下。那*cpp[-2] 理论上应该是 cp[0] 的值*cpp[2] 3 的输出那应该很容易可以得出来了。就是 HI了。6、printf(%s\n,cpp[-1][-1]1);我们知道cpp[-1]就是当前的值往前偏移一个位置跟上面的推断一样当前cpp还是在cp[2]这个位置所以cpp[-1]实际上就是cp[1]的位置然后cpp[-1][0]就是 WORLD的位置cpp[-1][-1]就是WORLD再往前偏移一个位置就是NEW了。后面再来一个1 那输出结果应该就是 EW了至于最后的那个print(%s\n,*cpp)因为cpp是三级指针这样只取到二级指针最终输出的结果应该是不确定的。熬夜写完也不能说完全正确欢迎评论一起讨论如果觉得不错转发支持一下如果觉得不好意思转发点个在看让我知道有人在看谢谢。扫码或长按关注