C语言指针经典例题详解

🎁🎁创作不易,关注作者不迷路🎀🎀


前言

至此我们对于 C语言指针详解的四个章节已全部讲解完毕,指针作为C语言中的重头戏,大家掌握的都怎么样了呢?接下来我将用一篇文章来讲解一下三道指针的经典例题,大家不妨跟着例题检验一下自己的学习成果吧。

💖The Begin💖点点关注,收藏不迷路💖
文章干货满满,还请您细细品读,如果您觉得作者写得不错,抑或对您有所帮助,不妨给俺点个免费的赞和玩玩呢? 关注作者不迷路,后续将有更多原创内容更新哟

题例一

题目如下

#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)
此处就留给读者思考了,

如果您仍有不清楚的地方,您可以移步至评论区将您的困惑发布出来,引发思考,也能够填补文章漏洞,这再合适不过啦

观众姥爷如果您觉得写得不错,还望赏个三连
以上就是关于的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!
💖The End💖点点关注,收藏不迷路💖
  1. 例如,int a=10;int b=a+1与int b=a++这段代码的区别,想必大家都能轻易道明。虽然b的值都是11,然而a+1后,得到的a仍为10,而a++得到的a为11。因此自加会改变被操作数的值,那么类比到指针中,每一次++都会更新指针的起始位置而不论进行多少次+1操作,指针的起始位置都不改变这也是为什么每次都要更新我们画的图示的原因 ↩︎

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值