【C语言】指针的高级用法(指针数组,函数指针,函数指针数组,回调函数)
前言
当你学了指针的基本用法,那不妨看看指针的高级用法。在本片博客中,作者将会带领你学习和理解并且使用指针的高级用法。
一.指针数组
数组大家都知道,数组是用来存储一组相同类型数据的集合,例如有:整形数组,字符型数组、双精度度浮点型数组。那么指针数组是什么呢,指针数组就是一组存放指针类型的集合。如下图所示。
指针数组的每一个元素都是一个地址,每个元素都可以指向一块区域。
那么数组指针有什么用呢?下面会介绍到
二.函数指针
函数指针是一个存放函数地址的指针,也就是说,函数指针是一个指针指向一个函数的地址。我们知道每一个变量都会有自己的地址,其实函数也会有自己的地址,这时我们可以用一个指针来存放函数的地址。
从代码中,我可以看到,其实函数也是有自己的地址的,同时无论是Add还是&Add,输出的是相同的结果,也就是说函数名就是函数的地址。
那么当我们定义了一个函数的时候,如何将这个函数的地址存放到一个指针变量里面?
答案是使用函数指针。
函数指针用法如上, 各个位置的意义如下。
1.函数指针的使用。
2.typedef函数指针的使用
在我们使用函数指针的使用需要很长的定义,这个时候我们可以使用typedef关键字来缩短代码长度。
也就是说,使用typedef重定义后,int (*pAdd)(int,int)等同于p_fun pAdd。
三.函数指针数组
前面我们知道,函数指针是一个存放函数地址的指针变量,那么函数指针数组就是一个数组,里面存的都是函数指针。那么函数指针数组有什么用呢?函数指针数组可以用来实现转移表。
1.函数指针数组的定义
那么函数指针数组如何定义呢?如下所示。
2.计算器的一般实现
函数指针数组的用途。
通过这种实现的方法,代码非常臃肿,有许多相似或者是重复的地方。使用转移表来实现,可以大大的简化代码。
3.计算器的转移表实现
通过观察可以发现,每一个功能函数的返回值和参数类型都是一样的,也就是说它们的函数指针类型也是一样的,那么我们可以通过创建一个函数指针数组来存放这四个功能函数的地址,需要调用那个函数的时候,只需要调用对应的数组位置即可。
四. 回调函数
什么叫回调函数,回调函数就是通过函数指针调用的函数。
通俗的讲就是,将一个函数A的地址作为函数B的参数传递给函数B中,在使用这个函数B,会在该函数B内部,通过使用函数指针的方式来调用函数A。
回调函数的使用举例:在C语言标准库中,有一个用于快速排序的库函数,这个库函数就有用到回调函数,下面来举例。
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
这个qsort库函数的函数参数有四个,分别是:需要排序的数组,该数组的总字节大小,每个元素的大小,以及一个compare比较函数,其中这个compare比较函数需要自己设计。原因:qsort这个库函数不知道你需要排序的数据类型,有可能是int,char,甚至有可能是一个结构体数组,因为这个原因,所以我们需要自己设计一个compare比较函数来帮助qsort完成排序,其中compare函数就是你需要排什么类型数据来设计。
注意!!! 函数名就是函数的地址。
1.使用冒泡排序算法来模拟实现qosrt函数
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/92364.html