在C语言中,就像普通的数据指针(int *,char *等)一样,我们可以具有指向函数的指针。以下是一个简单的示例,显示了使用函数指针进行的声明和函数调用。
![ec74ce94d61a6da5af3a85e685fde8cd.png](https://i-blog.csdnimg.cn/blog_migrate/b8b58d236105ba4bf397d7b3434a277b.png)
![77fc5a4d74578fa0fb71bbb5dfa25738.png](https://i-blog.csdnimg.cn/blog_migrate/a0d9c5923375686738113245c1030adb.png)
在上面的示例中,为什么在功能指针(例如fun_ptr)周围需要一个额外的括号?
如果删除括号,则表达式“ void(* fun_ptr)(int)”变为“ void * fun_ptr(int)”,这是一个返回空指针的函数的声明。
以下是有关函数指针的一些有趣的事实。
1.与普通指针不同,函数指针指向代码,而不是数据。通常,函数指针存储可执行代码的开头。
2.与普通指针不同,我们不使用函数指针分配取消分配内存。
3.函数名称也可以用来获取函数的地址。例如,在下面的程序中,我们在分配中删除了地址运算符'&'。我们还通过删除*更改了函数调用,该程序仍然有效。
![cba0edb266b9ca150086bbd0dabc25ae.png](https://i-blog.csdnimg.cn/blog_migrate/d359900c34b36e942918a2cb3559f795.png)
4.像普通指针一样,我们可以有一个函数指针数组。下面第5点的示例显示了指针数组的语法。
5.可以使用功能指针代替开关盒。例如,在下面的程序中,要求用户在0和2之间进行选择以执行不同的任务。
![9a792c33d90dae9e09b8a8dcac693cfc.png](https://i-blog.csdnimg.cn/blog_migrate/2b6eb48eab59054388aadac58e90fef2.png)
6.像普通数据指针一样,函数指针可以作为参数传递,也可以从函数返回。
例如,考虑下面的C程序,其中wrapper()接收一个void fun()作为参数并调用传递的函数。
![1516700d9386046529943d5edb9e2e9b.png](https://i-blog.csdnimg.cn/blog_migrate/7d5129f68c6e12b7fe72e700bf0d03b4.png)
这一点在C语言中特别有用。在C语言中,我们可以使用函数指针来避免代码冗余。例如,简单的qsort()函数可用于以升序或降序或在结构数组的情况下以任何其他顺序对数组进行排序。不仅如此,借助函数指针和void指针,还可以将qsort用于任何数据类型
![56feee8ab21a8d1c24a9047f99fa23ac.png](https://i-blog.csdnimg.cn/blog_migrate/11a2bec5e5abdbc6fe70910f0af9b6cc.png)
与qsort()类似,我们可以编写自己的函数,这些函数可用于任何数据类型,并且可以执行不同的任务而无需代码冗余。以下是可用于任何数据类型的示例搜索功能。实际上,我们可以使用此搜索功能通过编写自定义的比较功能来查找接近的元素(低于阈值)。
![421611c1ebe731efe451a91eecbe051d.png](https://i-blog.csdnimg.cn/blog_migrate/c8839d6fd6f94fb9c2690119b187ecf2.png)
通过编写单独的自定义compare(),以上搜索功能可用于任何数据类型。
7. C ++中许多面向对象的功能都是使用C中的函数指针实现的。例如虚函数。类方法是使用函数指针实现的另一个示例。
想领取免费资料以及教程,请查看下方图片:
![940931f25281a47721cb7d0fc4618131.png](https://i-blog.csdnimg.cn/blog_migrate/b5d005bd88ced6f9a5f138ee3b2681f1.png)