上篇文章简单介绍了【指针】的初级知识,知道了指针的概念:
对以上这些不是很熟悉的,或者没有看过上一篇文章的小伙伴,建议看完指针初阶的介绍再看本篇噢
接下来将讨论【指针】的高级主题
提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处还请多多指点~ 废话不多说,直接上干货!下面案例可供参考
在C语言中,是没有一个数据类型能够存储字符串的,那么只有两种方式能够存储指针:字符类型的数组和字符指针
字符数组很好理解,就是把字符串的每一个字符都存放在数组中
字符指针指的是:将字符串的首字符地址存放在一个指针中,指针的类型是char类型
我们看下面这段代码:




了解了数组指针,我们来看数组指针如何使用:
(一般在二维数组中使用,下面案例仅供参考)

我们先辨析文字:
数组指针:(以指针结尾)是一个指针,指针指向数组
指针数组:(以数组结尾)是一个数组,数组存放指针
下面来辨析代码:


强调一个知识点:函数名就是函数地址
记住咯,来看代码:

特别注意:
198 行处 *pf 的星号只是表明 pf 是一个指针, pf 存放 Add 的地址,所以 pf == &Add
而函数名就是函数地址,所以 &Add 可以直接替换成 Add 所以 pf == Add
199 行处 *pf的星号是解引用操作符,对 pf 解引用得到 Add 函数的地址,也就是 Add,刚刚说过 Add == pf ,所以这里的解引用操作符没有实际意义

有了指针和指针数组的铺垫,以及认识了函数指针,相信大家不难理解函数指针数组,
来看函数指针数组的定义方式:

我们先来看一段实现【计数器】的基本写法:

这段代码没有任何语法错误和逻辑错误,仅仅利用了switch语句+调用了几个简单的函数
但是大家会看到,switch语句中的case语句中多次出现了一些重复且功能相同的代码,我们把这种现象称为代码冗余
我们仔细看一下冗余的代码片段,都是在执行调用某个函数
那如果我们把这些函数放在一个数组中,利用下标,配合case语句的“1、2、3、4”,就可以直接从数组中找到想要的函数,从而避免代码冗余。
来看代码如何写:

之前发布的【函数】初阶的文章中提到了回调函数,由于当时没有讲指针,所以答应大家在【指针】这篇会讲到,现在它来啦!
如果对函数这一章节 “链式访问” “嵌套” “递归”不是很熟悉的话可以看看介绍函数的这篇文章噢
话说又说回来,什么是回调函数?
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进 行响应。
说人话:
就是有两个函数:函数 A ,函数 B ,把 A 的地址传参给 B ,在 B 函数中调用 A
B 函数中调用了 A ,就去执行 A ,如果 A 有返回值,返回值返回到 B 中
刚刚再将函数指针数组的时候,为了避免【计数器】代码中的冗余,使用了函数指针数组,现在再介绍另一种更优的避免代码冗余的方式:就是回调函数
还记得那段代码冗余的原因吗:调用加减乘除函数的时候重复的代码太多
我们再学习【函数】的时候,函数的意义不就是:避免重复造轮子嘛
所以面对重复的代码,最优的解法就是把它们写成一个函数
问题又来了,这里面我们确实需要根据情况不同去选择调用加减乘除,根据已有的知识储备似乎也没法写成某个函数诶
所以我们来学习一下回调函数:

浅浅总结一波就是:
将 ”选择“ 这段代码写成 choose 函数,在 choose 函数 return 的地方调用加 / 减 / 乘 / 除去计算,算完了以后把结果 return 给 choose函数 ,choose 函数再 return 给 main 函数。
以上就是今天要讲的关于【指针】的进阶内容,干货满满,小伙伴们也要注意辨析:指针数组,数组指针,函数指针,函数指针数组
在后续各位学习数据结构【线性表】的时候还会经常用到二级指针以及结构体指针,结构体数组指针等等,所以指针很重要!!!
如果你目前能把本片的内容都理解,吃透,你一定超过了绝大多数人!!
如果哪些地方有疑问,欢迎评论区讨论~
如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦~
上山总比下山辛苦
下篇文章见