• 一道经典的指针笔试题!!!!


    写在前面

    本篇文章讲解了一道关于指针和数组的经典笔试题。
    前两篇关于指针和数组的讲解,链接如下:
    详解C语言指针(一)
    详解C语言指针(二)
    在这篇文章中,我们将深入讨论一段复杂的C语言代码,并分析其结构和执行过程。该代码使用了指针和数组的复杂组合,让我们一步步来剖析它。

    1. 笔试题代码

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. 代码解释

    代码开始时,我们定义了一系列的数组和指针:

    	char *c[] = {"ENTER","NEW","POINT","FIRST"};
    	char**cp[] = {c+3,c+2,c+1,c};
    	char***cpp = cp;
    
    • 1
    • 2
    • 3

    数组 c :是一个包含指向字符的指针的数组,使用了4个常量字符串来初始化该数组。
    数组 cp :是一个包含指向指向字符的指针的指针的数组。
    下面图片是上述代码的逻辑图
    在这里插入图片描述

    3. 代码执行

    现在,我们来逐步解释 printf 语句的执行:
    第一个printf:

    printf("%s\n", **++cpp); // 输出: "POINT"
    
    • 1
    1. ++cpp(等价于cpp = cpp + 1), 将 cpp 跳过了cp数组的一个元素,此时cpp=&cp[1],指向了这个位置:
      在这里插入图片描述

    2. **++cpp 对其进行两次解引用,第一次解引用,得到了cp[1](即 c+2),然后再次解引用得到了 POINT字符串的首元素地址。所以这里输出POINT。

    第二个printf:

    printf("%s\n", *--*++cpp+3);//输出TER
    
    • 1
    1. ++cpp (等价于cpp = cpp + 1)使cpp又跳过了cp数组的一个元素,此时cpp=&cp[2],指向了这个位置:
      在这里插入图片描述

    2. *–*++cpp+3 先对其进行了一次解引用,得到的是 c+1(c[1]),然后进行–操作,此时cp[2] = c,再对其解引用,得到的是ENTER的首元素地址,最后+3得到的是字符E的地址,所以这里输出为 ER。
      在这里插入图片描述

    第三个printf:

    printf("%s\n", *cpp[-2]+3);
    
    • 1
    1. cpp[-2] 等价于*(cpp - 2)等价于cp[0],即c+3,在对其解引用拿到了FIRST的首字符地址。

    2. 将 FIRST的首字符地址加上 3,得到了字符S的地址,因此这里输出为 ST。

    第四个printf:

    printf("%s\n", cpp[-1][-1]+1);
    
    • 1
    1. cpp[-1][-1]等价于*(*(cpp-1) - 1),拿到了NEW的首字符地址。
    2. 将NEW的首字符地址加1,拿到了字符E的地址,因此这里输出为EW。

    运行结果

    在这里插入图片描述

    总结

    这道指针笔试题演示了如何使用指针和数组的组合来访问字符串和进行操作。通过逐步分析代码的结构和执行过程,我们更好地理解了C语言中的指针和数组概念。至此,详解C语言指针系列就全部写完了!!!

    至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
    创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
    如果本篇博客有任何错误,请批评指教,不胜感激 !
    在这里插入图片描述

  • 相关阅读:
    vue 部署到本机IIS 部署 SPA 应用
    阿里同步神器Canal原理+安装+快速使用
    独立思考之-----家庭容器的合理构造
    布隆过滤器 python3 pybloom_live使用例子 存储开销
    200. 岛屿数量
    实在智能牵手埃林哲,“TARS-RPA-Agent+云时通”双剑合璧共推企业数字化转型
    【C++】day2学习成果:引用、结构体等等。。。
    BGP笔迹2
    nginx vue2+webpack 和 vue3+vite 配置二级目录访问
    【C++】函数重载 & 引用 & 内联函数
  • 原文地址:https://blog.csdn.net/m0_50655389/article/details/133623896