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

阳光穿透心脏的1/2处 2023-09-24 22:22 161阅读 0赞

目录

发布这篇博客的缘由

题目

解答

结语


发布这篇博客的缘由

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

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

题目

  1. #include<stdio.h>
  2. int main()
  3. {
  4. char* c[] = { "ENTER","NEW","POINT","FIRST" };
  5. char** cp[] = { c + 3,c + 2,c + 1,c };
  6. char*** cpp = cp;
  7. printf("%s\n", **++cpp);
  8. printf("%s\n", *-- * ++cpp + 3);
  9. printf("%s\n", *cpp[-2] + 3);
  10. printf("%s\n", cpp[-1][-1] + 1);
  11. return 0;
  12. }

解答

大家第一眼看到这个题目是不是感觉头都开始发昏了,先别急,我来带大家一步一步的解决这个问题。那么首先呢,我们要做的就是画图。

4cd29caabc5d47de9ff1183c8f7a4586.png

当我们把图给画出来之后,我们的思路是不是一目了然了呢?我们先来看第一个打印:

  1. printf("%s\n", **++cpp);

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

4bad08e71a8143e7a989d07c92550bcd.png

再看第二个打印

  1. 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。

cbe0ad83f183458388c3bdaf1364fa51.png

第三个打印

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

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

再看最后一个打印

  1. 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。

d19981c74668431eade6cfa0445d4bd1.png

最终的答案就是

14110cd014bb4b5c83ffec7dfd3397fa.png

结语

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

#

发表评论

表情:
评论列表 (有 0 条评论,161人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一道编程题目

    昨天在微信群看到有人在讨论一个问题, 具体题目如下: 入参两个Intger,返回空,然后使这个两个值在调用函数后交换。打印交换后的值,比如你初始化两个变量a和b对应的值