文章目录
- 写在前面
- 1. 笔试题代码
- 2. 代码解释
- 3. 代码执行
- 运行结果
- 总结
写在前面
本篇文章讲解了一道关于指针和数组的经典笔试题。
前两篇关于指针和数组的讲解,链接如下:
详解C语言指针(一)
详解C语言指针(二)
在这篇文章中,我们将深入讨论一段复杂的C语言代码,并分析其结构和执行过程。该代码使用了指针和数组的复杂组合,让我们一步步来剖析它。
1. 笔试题代码
#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;
}
2. 代码解释
代码开始时,我们定义了一系列的数组和指针:
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
数组 c :是一个包含指向字符的指针的数组,使用了4个常量字符串来初始化该数组。
数组 cp :是一个包含指向指向字符的指针的指针的数组。
下面图片是上述代码的逻辑图:
3. 代码执行
现在,我们来逐步解释 printf 语句的执行:
第一个printf:
printf("%s\n", **++cpp); // 输出: "POINT"
-
++cpp(等价于cpp = cpp + 1), 将 cpp 跳过了cp数组的一个元素,此时cpp=&cp[1],指向了这个位置:
-
**++cpp 对其进行两次解引用,第一次解引用,得到了cp[1](即 c+2),然后再次解引用得到了 POINT字符串的首元素地址。所以这里输出POINT。
第二个printf:
printf("%s\n", *--*++cpp+3);//输出TER
-
++cpp (等价于cpp = cpp + 1)使cpp又跳过了cp数组的一个元素,此时cpp=&cp[2],指向了这个位置:
-
*–*++cpp+3 先对其进行了一次解引用,得到的是 c+1(c[1]),然后进行–操作,此时cp[2] = c,再对其解引用,得到的是ENTER的首元素地址,最后+3得到的是字符E的地址,所以这里输出为 ER。
第三个printf:
printf("%s\n", *cpp[-2]+3);
-
cpp[-2] 等价于*(cpp - 2)等价于cp[0],即c+3,在对其解引用拿到了FIRST的首字符地址。
-
将 FIRST的首字符地址加上 3,得到了字符S的地址,因此这里输出为 ST。
第四个printf:
printf("%s\n", cpp[-1][-1]+1);
- cpp[-1][-1]等价于*(*(cpp-1) - 1),拿到了NEW的首字符地址。
- 将NEW的首字符地址加1,拿到了字符E的地址,因此这里输出为EW。
运行结果
总结
这道指针笔试题演示了如何使用指针和数组的组合来访问字符串和进行操作。通过逐步分析代码的结构和执行过程,我们更好地理解了C语言中的指针和数组概念。至此,详解C语言指针系列就全部写完了!!!
至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !