一道比较难以理解的指针题目

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。一道比较难以理解的指针题目,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

发布这篇博客的缘由

题目

解答

结语


发布这篇博客的缘由

各位朋友们,大家好啊,今天我给大家分享的是一道我在C语言学习的过程中遇到的比较经典的一道指针题目。我希望通过这道题的分享能够让各位朋友知道,在做编程题的时候,画图的重要性,因为通过画图你能简单明了的知道题目所给的意思以及你思考的方法。

接下来就来看看这道题到底是一个怎样的题目呢?

题目

#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("%s\n", **++cpp);

POINT这里cpp指向的是cp首元素的地址,那么++cpp了之后呢,就指向了cp首元素的下一个元素的地址,也就是存放c+2的地址,然后解引用拿到的是c+2,然后再解引用,就得到了c+2所指向的地址中存放的内容,所以这个打印就是”POINT”。

一道比较难以理解的指针题目

 

再看第二个打印

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

因为上一个打印,++cpp已经将cpp所指向的地址改变了,所以我们不能用cpp指向的原来的地址,cpp指向的是c+2所在的地址。这个打印我们还需要注意运算符的优先级,这里++、–和*是属于同一优先级的,运算顺序是从右到左进行的。++cpp使cpp指向的元素又移向下一个也就是c+1所在的地址,然后解引用拿到c+1,然后对c+1进行–,也就是c,这就说明原来cp中内容c+1被改为了c,然后解引用就得到了c的内容。c存放的是”ENTER”首字母的地址,然后+3就指向了ER的E,最后打印出来的就是ER。

一道比较难以理解的指针题目

 

第三个打印

printf("%s\n", *cpp[-2] + 3);

cpp[-2]就相当于*(cpp-2),所以cpp[-2]就得到的是cp首元素的内容c+3,然后再解引用就得到了c+3所指向的内容,也就是”FIRST”的首字母地址,再+3就指向了ST的S,最后打印出来的就是ST。这个过程中cpp的值并没有改变。

再看最后一个打印

printf("%s\n", cpp[-1][-1] + 1);

cpp[-1][-1]就可以改写成这样:*(*(cpp-1)-1),cpp-1指向了c+2所在的地址,解引用就拿到了c+2,然后-1得到c+1;继续解引用就得到c+1所指向的内容,也就是”NEW”的首元素地址,+1就指向了EW的E,打印出来就是EW。

一道比较难以理解的指针题目

 最终的答案就是

一道比较难以理解的指针题目

 

结语

那么做完了这道题,大家是不是就能知道画图所带来的好处了吧 ,在做一个题目之前如果我们能画出这道题的解题思路,我们就能轻松的将这个题给做出来,并且正确率也会提高,我们一定要养成画图的好习惯。那么这就是今天我的所有分享,希望对大家能有帮助,感谢大家的观看。       ·

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/192670.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!