C语言大神进来看看这个题目

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

题目如下

就直接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]);	
}

图示解析

640?wx_fmt=png

解题过程

c 是一个数组,数组里面存的东西是 char *, 类型 cp 也是一个数组,数组里面存的东西是 char **, 类型 cpp 是一个指针,cpp 是一个三级指针,三级指针只能存二级指针地址

我用 gdb 调试如下640?wx_fmt=png从 gdb 调试可以看到 cpp 存的是一个地址,这个地址就是 &cp 也就是 0x601060

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

比如640?wx_fmt=png

几个printf 的输出结果

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

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

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

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

640?wx_fmt=png

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

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

这个就慢慢的显得难度上来了,看这个东西总觉得怪怪的,我们还是分解一下, 首先 ++cpp, cpp 是三级指针, 所以 *cpp 就是获取二级指针的值640?wx_fmt=png因为之前已经对 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" 字符串了。640?wx_fmt=png

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验证试一下。

640?wx_fmt=png

那*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是三级指针,这样只取到二级指针,最终输出的结果应该是不确定的。

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

640?wx_fmt=jpeg

扫码或长按关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qq浏览器主页_安卓浏览器哪家强?这些小众好用的手机浏览器你知道吗

前言无论手机还是电脑&#xff0c;浏览器都可以说是最重要的软件之一了。最流行的 Chrome 和 Firefox&#xff0c;国内常见的还有 UC、QQ、360 浏览器等。手机上可供选择的优秀浏览器还有很多&#xff0c;这次就推荐些其他的小众但是也很好用的安卓手机浏览器。安卓手机浏览器推…

ms access to mysql_Access转MySQL工具

Bullzip MS Access To MySQL是一个Access转MySQL工具&#xff0c;可以帮助用户把MS Access数据库中的内容转到MySQL数据库中&#xff0c;支持全部转换以及有选择的转换&#xff0c;支持命令行&#xff0c;非常适合有Access转MySQL需求的数据库维护人员使用。Bullzip MS Access …

_一文让你透彻理解Linux的SOCKET编程(含实例解析)

1. 网络中进程之间如何通信进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行&#xff0c;为保证两个相互通信的进程之间既互不干扰又协调一致工作&#xff0c;操作系统为进程通信提供了相应设施&#xff0c;如UNIX BSD有&#xff1a;管道&#xff08;…

老师好

今天是教师节&#xff0c;今年楠哥也上幼儿园了&#xff0c;以后估计会经常跟老师有接触&#xff0c;我楼上的一个邻居&#xff0c;叫老莫&#xff0c;跟我的关系很好&#xff0c;有钱&#xff0c;又有儿有女&#xff0c;大女儿现在已经上小学了&#xff0c;每天上班的时候&…

Bootstrap全局CSS样式之表单

.form-control——将单独的表单控件赋予一些全局样式&#xff0c;如默认宽度width:100%。 .form-group——包裹表单控件&#xff0c;获得最好的排列&#xff1b; .form-inline——将表单设置为内联表单&#xff0c;仅仅适用于视口&#xff08;viewport&#xff09;至少在 768px…

mysql索引使增删变慢_mysql优化(四)–索引

http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html一、 四种索引类型&#xff1a;主键索引&#xff0c;唯一索引&#xff0c;全文索引&#xff0c;普通索引二、 为什么建立索引比较快一般的数据表是按照行来存储的&#xff0c;字段多、有长字段的表的记录就会长…

Linux 下的推迟执行

准备中秋节说个活动&#xff0c;评论文章点赞排名&#xff0c;用心评论哦&#xff0c;前5名获得每人 19 心意红包。感谢大家的支持我最近在用freertos&#xff0c;想让一个任务在某个时间后再执行&#xff0c;找了一圈&#xff0c;竟然没有这样才处理机制&#xff0c;因为也是新…

ASP.NET系统退出(移除Session 、清除浏览器缓存)

一、在退出时移除Session&#xff0c;首先在登录时要记录登录信息 Session["id"] user.id.ToString();Session["name"] user.name.ToString();Session["pwd"] user.password.ToString();Session["time"] user.LoginTime.ToString(…

js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)

自己学生时代的代码&#xff0c;发现还保存着&#xff0c;今天拿出来分享下。用js和html5 canvas对象实现一个简单钟表程序主要用到的就是h5的canvas对象canvas对象本人也不是很熟&#xff0c;大致看了几个常用的方法&#xff0c;难免有不足之处&#xff0c;仅是练习所用。实现…

mysql 根据当前时间戳_mysql timestamp类型 根据当前时间戳更新

注意到这个是因为一次事故。一个简单的操作记录表&#xff0c;只记录了一个操作人&#xff0c;操作时间&#xff0c;操作结果。当时为了演示效果&#xff0c;在生产环境中去修改&#xff0c;创建数据。一顿操作猛如虎之后发现&#xff0c;所有改过的数据的创建时间都变成了当前…

设置拖拽事件,获取拖拽内容

设置dragEnter 设置DragDrop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using…

笔记本电脑锁_2020年双11有哪些值得选购的笔记本电脑?(全能本/便携高性能笔记本电脑/设计本)...

&#xff08;本文于2020年10月22日更新&#xff09;本文章会不定期更新&#xff0c;保证文章的时效性和准确性&#xff0c;可点赞或收藏本文章&#xff0c;这样在需要的时候可以找到啦。文章推荐产品较多&#xff0c;按价位排序&#xff0c;篇幅较长&#xff0c;可按键盘CtrlF快…

android libc 有哪些函数_Android scudo功能介绍

一 简述前面介绍了malloc_debug功能&#xff0c;用来进行内存泄露等检测&#xff0c;其实android可以使用多种方法进行内存相关的监控。比如利用llvm功能再编译时添加内存的相关检测。Android R默认开启了scudo。scudo这个选项主要功能是再分配内存时会添加64 bit的Header// Ou…

300来行代码实现最小Linux文件系统

Linux作为一个类UNIX系统&#xff0c;其文件系统保留了原始UNIX文件系统的表象形式&#xff0c;它看起来是这个样子&#xff1a;rootname-VirtualBox:/# lsbin boot cdrom dev etc home lib lib64 lostfound media mnt opt proc root run sbin snap srv sys …

淘宝怎么多个订单一起付款_淘宝未付款订单如何催付?

淘宝未付款订单如何催付&#xff1f;很多人只认为运营就是技巧&#xff0c;其实客服也是需要技巧的&#xff0c;客服也是关键的数据支撑。一个好的客服团队&#xff0c;能够很好地提高转化率、客单价、复购率&#xff0c;有效的降低退款率、纠纷等售后问题。今天和大家分享一下…

mysql存储过程触发器游标_MySQL存储过程,触发器,游标

语法&#xff1a;1.存储过程&#xff1a;create PROCEDURE name(argment_list)beginsql_statement;end2.触发器&#xff1a;create trigger name (before|after) (insert | update | delete) on table_namefor each rowbeginsql_statement;end3.游标:declare cursor_name curso…

爱大姚,恨男篮

先祝姚明生日快乐2019年9月12日。是中国篮协主席、CBA董事长姚明39岁的生日&#xff0c;时间已经过去几天了&#xff0c;当时铺天盖地的都是其他的热点新闻&#xff0c;很多人&#xff0c;包括我也忘记了这个大个子已经39岁了&#xff0c;看着中国男篮的惨败&#xff0c;很想冲…

Linux 内核系统架构

描述Linux内核的文章已经有上亿字了但是对于初学者&#xff0c;还是应该多学习多看&#xff0c;毕竟上亿字不能一下子就明白的。即使看了所有的Linux 内核文章&#xff0c;估计也还不是很明白&#xff0c;这时候&#xff0c;还是需要fucking the code.28年前(1991年8月26日)Lin…

gif透明背景动画_如何利用premiere制作GIF动态图片

GIF制作流程(也可以用此教程把视频变成GIF动图)作者&#xff1a;益红一、导出设计文件将要做动画的文件在ps里面导出 (透明图层用PNG)(也可以将合适的视频片段作为素材)二、在PR里面新建项目打开 Adobe premiere选择 新建项目找到新建项目 — 命名 —设置合适的项目 位置-点击浏…

mysql sqlserver分页_SqlServer、MySql万能分页代码

sql数据库中常用的分页 我做了一个万能的 用的上的小伙伴拿去耍吧go ----SqlServer万能分页代码create procedure [dbo].[sp_datapager]pagesize int,--每一页的大小pageindex int,--页码数tablename varchar(Max),--表的名称keycolumn varchar(20),---主键idcolumns varchar(…