1. 回调函数
回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调用的函数就是回调函数。
我们来正常生成一个计算机程序来观察一下


你会发现这其中有很多相似的步骤就比如每个case中的的语句,只是调用的函数不同而已,我们刚学了函数指针数组,这时你们就可能会想到利用函数指针数组来访问函数,回调函数就是函数指针的一种非常重要的应用, 这里就会问了,不是函数指针数组吗?为什么说是函数指针呢?函数指针数组是多个函数指针放在同一个数组中,本质也是函数指针,而且回调函数也能使用函数指针来实现。
函数指针数组:

上次那个函数指针数组的使用格式也叫做转移表,通过函数指针数组来回调函数,简化了调用函数的过程。
函数指针:

用函数指针调用,则只需要在case中调用指针函数,将函数传地址的方式通过函数指针来调用函数。
2. qsort使用
qsort是个库函数可以直接使用,用于对数据进行排序的,是基于快速排序的思想进行排序的,我们之前学过一个冒泡排序,冒泡排序是一种排序方法,快速排序也是一种方法,一般不要求我们写冒泡排序我们一般都是使用qsort,而且qsort是什么数据类型都能接收的。

并不是qsort按照自己的方式来进行比较,而是你需要传入比较函数指针来进行比较。对于函数指针也不是没有要求的:

我们可以通过这个速记口诀来记忆。
我们生成一个比较函数来试试怎么用:

这里注意一下,头文件stdlib.h千万不要忘记了,qsort中的各个条件一定要记住,学好一文编程语言最重要的就是语法,这个求元素个数的放到外面就更好看出来了。
3. 指针运算笔试题
3.1 习题1

这里的重点就是(&a+1)我们之前说过&数组名==整个数组的地址,+1就是加了一整个数组的大小,因为整个数组的地址和首元素的地址是一样的,所以我们加一整个数组的地址就直接跳到数组a的下一块内存地址,强制类型转换后,(ptr-1)实际上是减了一个int的空间,也就是a4所指向的地址,解引用之后就是5;(a+1)这个难度不高,我们之前就着重强调过数组名就是首元素的地址 ,现在+1就是加一个元素的空间,就是a1的地址,解引用就是2。
3.2 习题2

这里是考察逗号表达式,因为这里是小括号所以其实a中的元素就只有3个,分别为1,3,5;p=a0代表二维数组第 0 行首元素地址,等价于&a00,赋值给int *p,也就是1。
3.3 习题3

这里主要考察二维数组的数组名,二位数组的数组名指的是第一行元素的地址,ptr1就是正常的整个数组的地址,上一题一样的思路,我们重点讲一下ptr2;aa指的是第一行元素的地址,+1则跳过一行元素的空间,*(aa+1)=aa10,指的就是第二行元素的首元素,(ptr2-1)指向的就是5对应的空间。
3.4 习题4

这主要考察的是二级指针,二级指针pa指向*a对应的空间,这样你可能有点难看出来,其实你将字符指针数组的语法套进去你会发现还是很好看懂的,pa=a0,这里我们需要注意一定,pa指向的是a0中首元素的地址,只是因为是使用%s打印,%s拿到字符起始地址后就会一直往后打印,知道遇到\0,并不是只打印一个字符。
4. 总结
我们通过习题可以深程度的了解指针的使用方式,也方便我们巩固一些知识点,你们在其他时间也需要通过刷题来查漏补缺,相信你们可以将指针学透!