之前一个读者给我发的一个题目,我大概看了下,题目的难度还是比较大的,而且考察的内容也比较多,可能在实际项目上使用比较少,估计十几年的老码农都没有用过,但是在看大神的代码的时候,就特别考验基本功,能不能理解理解别人的代码非常重要。

题目如下

就直接printf出几个的输出值,比较自信的大神可以直接回复答案,可以看看自己的答案对不对。

#include <stdio.h>  char *c[] = {"HELLO","NEW","WORLD","SAYHI"};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;    int main(void)
{   printf("%s\n",*cpp[2]);   printf("%s\n",**++cpp); printf("%s\n",*--*++cpp+3);    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 也就是 0x601060

cp 是数组,里面的数组存的是 char ** ,如果我们想拿到 char * 的字符串,就需要使用 *p[x] 来获取里面的字符串

比如

几个printf 的输出结果

1、printf("%s\n",*cpp[2]);

实际上获取的就是 c+2 也就是 NEW 字符串

2、printf("%s\n",**++cpp);

** ++cpp 是先取cpp 移动到下一个位置,然后再取值,cpp移动多少位置呢?是sizeof(char ***)的大小

cpp 移动 到下一个就是 c+2 所以 *++cpp 就是 "WORLD"

3、printf("%s\n",*--*++cpp+3);

这个就慢慢的显得难度上来了,看这个东西总觉得怪怪的,我们还是分解一下, 首先 ++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是三级指针,这样只取到二级指针,最终输出的结果应该是不确定的。

熬夜写完,也不能说完全正确,欢迎评论一起讨论,如果觉得不错,转发支持一下,如果觉得不好意思转发,点个在看让我知道有人在看,谢谢。

扫码或长按关注

C语言大神进来看看这个题目相关推荐

  1. 饭店菜单选择c语言,求C语言大神,帮忙做一下这个题,要源代码设计实现一个餐厅点餐系统? 爱问知识人...

    求C语言大神,帮忙做一下这个题,要源代码 设计实现一个餐厅点餐系统,实现电子点餐.要求实现二级菜单: 一级菜单: 请选择: 1.点餐 2.查看已点菜品 3.添菜 求C语言大神,帮忙做一下这个题,要源代 ...

  2. linux 计算器 c语言,大神教你如何用C语言实现科学计算器

    原标题:大神教你如何用C语言实现科学计算器 用C实现的科学计算器 使用C语言写的科学计算器,可以实现四则运算.三角函数运算.指对数运算:优先级正确:能智能屏蔽空格,能识别输入错误和运算错误,能实现继续 ...

  3. Go语言大神亲述:历七劫方可成为程序员!

    "历劫1":你坚信你可以用Go来做面向对象编程? 在经历了一次Go应用之旅之后,你可能就会开始思考:"怎么样才能让这种语言更像面向对象的编程语言?"因为你已经习 ...

  4. C Primer Plus怎样高效学?C语言大神案例值得借鉴!

    我们常常听到有人争论"Python.Java.PHP......是这个世界上最好的语言",却很少听到有人夸赞C语言,为什么呢?因为C语言实在是太太太太难了...... 为什么这么多 ...

  5. 用c语言求元素移动的次数T(n),悬赏!求C语言大神帮忙,写一个数字推盘游戏的程序(N-puzzle) 具体的要求看图片...

    满意答案 zcloj 2013.10.14 采纳率:56%    等级:12 已帮助:5505人 这是我在网上收藏在本地的数独游戏代码.看能否符合你的要求 #include int fun(int a ...

  6. java制表位是什么意思_java制表位如何应用?大神进来。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面是我的代码. import java.util.Scanner; public class Zuoye7{ public static void ma ...

  7. 求大神解决下这个题目!做好请发到308960728@qq.com

    RIP动态路由配置 RIP是使用最广泛的距离向量协议,通过本次配置来理解RIP协议的传播.分析.挑选路由,来实现路由发现.路由选择.路由切换等功能,掌握RIP动态路由信息协议的配置方法. 1.RIP配 ...

  8. c语言int32u的作用,求c语言大神 帮我解释一下这段说的都是啥?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //滚动显示 } else if(Mode == 0xdd){ OffsetTemp = j + Offset; if(OffsetTemp<16) ...

  9. headfirstjava最新版本下载_读过HeadFirstJava的大神进来看看

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 线程一章有个聊天程序,我运行之后客户端没将服务器的内容显示在JTextArea中,求解答 客户端程序 import javax.swing.*; impo ...

最新文章

  1. 对面向对象基本原则的总结
  2. 【Java笔记】C++与Java的对比
  3. Windows 窗体多线程
  4. [VS2010]在C#工程中设置Reference的相对路径
  5. Mongodb部署及使用
  6. C++ Primer 5th笔记(chap 16 模板和泛型编程)定义
  7. ADC128S022的verilog设计与仿真实现
  8. 循环获取另一个php变量,通过引用将多个变量传递给foreach循环(php)
  9. flask ajax json html,后端后,渲染模板通过Flask中的Ajax从前端接收JSON
  10. asp.net后台操作javascript:confirm返回值
  11. 百叶窗叶片锋利,不安全
  12. C++中toupper、tolower 、isalpha、isalnum、isdigit、islower、isupper、isblank、isspace的用法
  13. C#excelpackage读写Excel文件
  14. Python中 or 和 and 用法
  15. Thinkpad E450c WIN8 重装系统 如何U盘启动
  16. 得到网页的最新更新时间
  17. 有道云笔记Markdown编辑器 基础操作使用说明
  18. 微信群发消息怎么发?微信群发消息只需要4步?
  19. Linux内核之PCI设备
  20. linux操作系统为SCSI硬盘分区,Linux中硬盘分区的表示方法

热门文章

  1. Oracle的resetlogs机制浅析
  2. Lucene4:创建查询,并高亮查询关键词
  3. 西电网络攻防大赛--渗透测试第二题
  4. 查看及修改MYSQL最大连接数
  5. [转帖]关于win7共享的问题和解答
  6. Something about WinCE6.0 R3
  7. 如何在C#里实现端口监视呢?
  8. Python 内置模块之 时间模块 time
  9. get clone 出现 fatal: the remote end hung up unexpectedly5 MiB | 892.00 KiB/s 报错信息
  10. 大数据可视化html模板开源_大数据时代-可视化数据分析平台必不可少