🎁🎁创作不易,关注作者不迷路🎀🎀
前言
至此我们对于 C语言指针详解的四个章节已全部讲解完毕,指针作为C语言中的重头戏,大家掌握的都怎么样了呢?接下来我将用一篇文章来讲解一下三道指针的经典例题,大家不妨跟着例题检验一下自己的学习成果吧。
![](https://i-blog.csdnimg.cn/direct/2c1ed84a194f43869adb43ebec3e612a.jpeg#pic_center)
题例一
题目如下
#include <stdio.h>
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
return 0;
}
大家觉得答案是什么呢?不妨思考后,继续向下看。
题例一详解
首先,我们看到题目 &p[4][2] - &a[4][2]
显然是指针减指针类型,得到的是两个指针间元素的个数
;其次,我们观察到a是五行五列的整型数组,因此a的类型是 int (* )[5],而p的类型是 int( )[4],在操作 p = a 时,两指针的大小不一致,这怎么办呢?想要解决其实并不难。只是p在访问时p一次访问四个元素,而a一次访问五个元素
*,如下所示:
理解到这里,那么问题已经解决了一大半了,图示可知,指针&p[4][2] 与指针&a[4][2]之间有4个元素,然而被减数小于减数,因此结果为-4
。
接下来就是打印输出了,一次以%p的形式输出,一次以%d的形式,我们需要知道%d打印时直接以原码
的形式打印,而%p打印时,以16进制补码
的形式打印,如下:
答案
因此答案为 FFFFFFC,-4大家都做对了吗>
题例二
题目如下
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
题目二详解
这段代码中,首先定义了一个字符指针数组 a,并初始化了三个字符串常量 “work”、“at”、“alibaba”。这里实际上是将
这三个字符串的首地址
分别存储在数组 a 的三个元素中。
接着定义了一个二级字符指针 pa,并将其初始化为指向字符指针数组 a 的首地址,即 pa = a。
然后将 pa 指针向后移动一位,即 pa++。此时 pa 指向了数组 a 的第二个元素,也就是指向字符串 “at” 的首地址。
最后,通过 printf(“%s\n”, *pa);输出 pa 所指向的字符串
。由于 pa 此时指向 “at” 的首地址,所以输出 “at”。
三、题例三
题目如下
#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)
首先,我们要明白自加的优先级是高于解引用的操作符的,因此自加后cpp指向c+2,再进行两次解引用得到了POINT,此时应更新我们画的图示,如下:
printf(“%s\n”, *-- *++cpp+3):
++cpp 使 cpp 指向了c + 1,*cpp 得到 c + 1,在对其进行自减 --*cpp,使这个指针指向 与c同样的位置(即“ENTER")
,再加3,得到ER,再次更新我们画的图示
,如下:
printf(“%s\n”, *cpp[-2]+3);
首先,cpp[2]等价于 * (cpp-2),此处需要注意的是自加与+1的区别1 (如果您不清楚,请点击小1,自动跳转为您解释)。因此此处答案为ST
printf(“%s\n”, cpp[-1][-1]+1)
此处就留给读者思考了,
![](https://i-blog.csdnimg.cn/direct/09179c9ef08e4073beb78afbc740a794.jpeg#pic_center)
例如,int a=10;int b=a+1与int b=a++这段代码的区别,想必大家都能轻易道明。虽然b的值都是11,然而
a+1后,得到的a仍为10
,而a++得到的a为11
。因此自加会改变被操作数的值
,那么类比到指针中,每一次++都会更新指针的起始位置
,而不论进行多少次+1操作,指针的起始位置都不改变
,这也是为什么每次都要更新我们画的图示的原因
↩︎