原题
#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;
}
//问打印结果
问打印结果
题目考查的内容
1、指针数组
指针数组是一个包含多个指针的数组,每个元素都是一个指向特定数据类型的指针。
字符串数组: 当处理多个字符串时,指针数组非常有用。
2、指针的加减整数
在C语言中,指针不仅可以存储地址,还支持与整数进行加减运算。指针加减整数的操作实际上是基于指针所指向的数据类型的大小来进行的。
指针加整数: ptr + n
,将指针 ptr
向后移动 n
个元素的大小(即移动 n * sizeof(元素类型)
字节)。
指针减整数: ptr - n
,将指针 ptr
向前移动 n
个元素的大小(即移动 n * sizeof(元素类型)
字节)。
注意:指针加减整数的运算量是按指针所指向的数据类型的大小来计算的,而不是字节数。
3、多级指针
多级指针(也叫做指针的指针)是指一个指针变量指向另一个指针变量的地址,间接地指向数据。在C语言中,指针的级数表示指针指向的是其他指针的地址。常见的多级指针包括二级指针、三级指针等。每增加一层指针,我们就需要在指针类型前加上一个星号(*
)。
题目分析
1、使用字符串数组来存储多个字符串的指针
char* c[] = {"ENTER","NEW","POINT","FIRST"};
这里字符串数组是一个包含多个char*类型元素的数组,每个元素指向一个字符数组。
在C语言中,字符串是以字符数组的形式存储的,并且以 \0
(空字符)作为结束标志,例如题目中"ENTER"在内存中实际上是一个字符数组{'E','N','T','E','R','\0'}。
2、使用二级指针来指向字符串数组中的元素
char** cp[] = {c + 3, c + 2, c + 1, c};
这里的二级指针数组中的元素c指向的是一级指针数组c中首元素的地址,类型是char**。元素c+x则是指向一级数组指针中的第1+x个元素的地址。
3、使用三级指针来指向二级指针数组中的元素
char*** cpp = cp;
这里使用了char***类型的cpp来指向二级指针数组里的首元素。
4、用printf()函数来打印结果
printf("%s\n",**++cpp);
printf("%s\n",*-- * ++cpp + 3);
printf("%s\n",*cpp[-2] + 3);
printf("%s\n",cpp[-1][-1] + 1);
通过指针与整数之间的运算,获得要打印的元素的地址,打印直到遇到\0。
题目解答
通过上面的题目分析,我们可以看出重点在于指针与整数之间的运算,这也是本题中最复杂的部分。
画图分析
我们通过画图分析的方式来完成指针与整数之间的运算分析。
初始状态
第一次打印时
++cpp
会让 cpp
指向 cp
的下一个元素,即 cp[1]
,它的值是 c + 2
**++cpp
解引用三级指针:
1、cpp
指向 cp[1]
,即 c + 2
2、*cpp
解引用为 c + 2
3、**cpp
解引用为 c[2]
,即字符串 "POINT"
。
输出:POINT
第二次打印时
++cpp
使 cpp
指向 cp[2]
,即 c + 1
。
*++cpp
解引用为 c + 1
。
--*++cpp
将指针 c + 1
减 1,变为 c
。
*--*++cpp
解引用为 c[0]
,即字符串 "ENTER"
。
*--*++cpp + 3
是指 "ENTER"
字符串地址加 3,得到 "ER"
。
输出:ER
第三次打印时
cpp[-2]
等效于 *(cpp - 2)
,即 cp[0]
,值是 c + 3
。
*cpp[-2]
解引用为 c[3]
,即字符串 "FIRST"
。
*cpp[-2] + 3
是指 "FIRST"
字符串地址加 3,得到 "ST"
。
输出:ST
第四次打印时
cpp[-1]
等效于 *(cpp - 1)
,即 cp[1]
,值是 c + 2
。
cpp[-1][-1]
等效于 cp[1][-1]
,即 *(c + 1)
,值是 "NEW"
。
cpp[-1][-1] + 1
是指 "NEW"
字符串地址加 1,得到 "EW"
。
输出:EW
答案
根据以上的分析,得到如上答案。
题目拓展
#include <stdio.h>
int main() {
char* c[] = { "njupt", "nju", "ptnju", "t" };
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;
}
感兴趣的可以研究一下上述代码
答案是:
总结
通过上面的题目,我们可以更加的深刻地理解C语言中的指针,为后续的高级编程打下扎实的基础。
标签:++,讲解,C语言,char,printf,cpp,cp,指针 From: https://blog.csdn.net/2402_83146415/article/details/144336402