概述指针是 C 语言中非常重要的特性也是学习过程中比较容易混淆的部分。指针函数和函数指针虽然名称相近但本质完全不同。本文从定义、声明方式和实际用途三个方面进行说明并进一步介绍基于函数指针实现的回调函数。一、指针函数指针函数本质上是一个函数只是它的返回值类型是指针也就是返回一个内存地址。例如int *pfun(int a, int b);这里的函数返回值类型为int *因此属于指针函数。指针函数可以用于返回动态内存、静态变量、全局变量或者数组元素的地址让调用者继续访问对应的数据。需要注意指针函数不能返回局部变量的地址。局部变量在函数结束后生命周期结束返回其地址会形成悬空指针继续访问可能产生未定义行为。代码示例#include stdio.h int *find_max(int arr[], int len); int main() { int num[] {1, 2, 3, 4, 5, 66, 7, 8, 9, 10}; int len_long sizeof(num) / sizeof(int); int *max find_max(num, len_long); printf(数组中最大的值为 %d, *max); printf(最大值所在的内存地址为:%p, max); return 0; } int *find_max(int arr[], int len) { int *max_p arr[0]; for (int i 1; i len; i) { if (arr[i] *max_p) { max_p arr[i]; } } return max_p; }运行结果数组中最大的值为 66 最大值所在的内存地址为:0061FF04这个例子中find_max()是函数而它返回的是int类型数据的地址因此属于指针函数。二、函数指针函数指针的主体是指针变量只不过这个指针保存的是函数的入口地址。例如int (*fptr)(int, int);这里的fptr是函数指针可以指向返回值为int、接收两个int参数的函数。只有返回值类型、参数数量、参数类型以及参数顺序符合要求的函数才能匹配相应的函数指针类型。函数指针可以用于动态调用函数、把函数作为参数传递以及实现回调机制。代码示例#include stdio.h int add(int a, int b); int sub(int a, int b); int main() { int (*p_func)(int, int); int i 10, j 20; p_func add; printf(%d %d %d, i, j, p_func(i, j)); p_func sub; printf(%d - %d %d, i, j, p_func(i, j)); return 0; } int add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; }运行结果10 20 30 10 - 20 -10这里的p_func是函数指针。它第一次指向add()调用时执行加法之后指向sub()调用时执行减法。三、指针函数和函数指针的核心区别本质不同指针函数本质是函数只是返回值为指针。函数指针本质是指针变量只是指向函数的入口地址。声明方式不同指针函数int *func(int);func先与括号结合说明func是一个函数返回值为int *。函数指针int (*p)(int);p先与*结合说明p是一个指针这个指针指向一个返回int、接收int参数的函数。判断这两个概念时可以重点观察括号的位置。用途不同指针函数主要用于返回内存地址例如返回动态内存首地址或数组元素地址。函数指针主要用于动态调用函数、作为函数参数以及实现回调函数、状态机和函数跳转表等功能。四、回调函数回调函数的实现基础就是函数指针。如果把一个函数的地址作为参数传递给另一个函数然后由后者在需要的时候通过这个函数指针调用目标函数那么这个被调用的函数就可以称为回调函数。简单来说通用函数不需要提前确定具体业务逻辑而是接收一个函数指针。调用通用函数时再把需要执行的具体函数传进去。回调函数的主要作用包括解耦将通用逻辑和具体业务逻辑分离。灵活扩展无需修改通用函数就可以传入不同的处理逻辑。事件处理可以用于需要在特定条件或时机执行指定逻辑的场景。回调函数的基本使用步骤约定回调函数的参数和返回值类型。编写符合要求的回调函数。编写接收函数指针的通用函数。调用通用函数时传入具体回调函数。代码示例#include stdio.h void print_app1(int num); void print_app2(int num); void array_traversal(int arr[], int len, void (*func)(int)); int main() { int arr[] {1, 2, 3, 4, 5}; int len sizeof(arr) / sizeof(int); printf(原数组为:); array_traversal(arr, 5, print_app1); printf(乘二后的数组为:); array_traversal(arr, 5, print_app2); return 0; } void print_app1(int num) { printf(app1: %d, num); } void print_app2(int num) { printf(app2: %d, num * 2); } void array_traversal(int arr[], int len, void (*func)(int)) { for (int i 0; i len; i) { func(arr[i]); } printf(); }这个例子中array_traversal()是通用数组遍历函数第三个参数func是函数指针。传入print_app1时数组元素按照原值处理传入print_app2时同一个遍历函数则使用另一套逻辑将每个元素乘以 2。总结指针函数和函数指针可以通过“主体是谁”来区分。指针函数的主体是函数特点是返回指针int *func(int);。函数指针的主体是指针特点是指向函数int (*p)(int);。而回调函数建立在函数指针之上通过把函数地址作为参数传递给通用函数可以让同一套代码执行不同的处理逻辑从而提高程序结构的灵活性。编程语言Cwww.share.zznkyyw.comC语言的魅力编程语言Cwww.app.zznkyyw.comC语言的魅力编程语言Cread.share.zznkyyw.comC语言的魅力编程语言Cwww.blog.zznkyyw.comC语言的魅力编程语言Cwww.wap.zznkyyw.comC语言的魅力编程语言Cwww.a.zznkyyw.comC语言的魅力编程语言Cwww.b.zznkyyw.comC语言的魅力编程语言Cwww.c.zznkyyw.comC语言的魅力编程语言Cwww.d.zznkyyw.comC语言的魅力编程语言Cnews.zznkyyw.comC语言的魅力编程语言Cm.blog.zznkyyw.comC语言的魅力编程语言Cwww.cctv.zznkyyw.comC语言的魅力编程语言Cwww.mobile.zznkyyw.comC语言的魅力编程语言Cm.mobile.zznkyyw.comC语言的魅力编程语言Cm.cctv.zznkyyw.comC语言的魅力编程语言Cwww.news.zznkyyw.comC语言的魅力编程语言Cshare.news.zznkyyw.comC语言的魅力编程语言Cshare.wap.zznkyyw.comC语言的魅力编程语言Cshare.read.zznkyyw.comC语言的魅力编程语言Cshare.blog.zznkyyw.comC语言的魅力编程语言Cshare.cctv.zznkyyw.comC语言的魅力编程语言Cshare.mobile.zznkyyw.comC语言的魅力编程语言Cwww.share.csfkym.comC语言的魅力编程语言Cwww.app.csfkym.comC语言的魅力编程语言Cread.share.csfkym.comC语言的魅力编程语言Cwww.blog.csfkym.comC语言的魅力编程语言Cwww.wap.csfkym.comC语言的魅力编程语言Cwww.a.csfkym.comC语言的魅力编程语言Cwww.b.csfkym.comC语言的魅力编程语言Cwww.c.csfkym.comC语言的魅力编程语言Cwww.d.csfkym.comC语言的魅力编程语言Cnews.csfkym.comC语言的魅力编程语言Cm.blog.csfkym.comC语言的魅力编程语言Cwww.cctv.csfkym.comC语言的魅力编程语言Cwww.mobile.csfkym.comC语言的魅力编程语言Cm.mobile.csfkym.comC语言的魅力编程语言Cm.cctv.csfkym.comC语言的魅力编程语言Cwww.news.csfkym.comC语言的魅力编程语言Cshare.news.csfkym.comC语言的魅力编程语言Cshare.wap.csfkym.comC语言的魅力编程语言Cshare.read.csfkym.comC语言的魅力编程语言Cshare.blog.csfkym.comC语言的魅力编程语言Cshare.cctv.csfkym.comC语言的魅力编程语言Cshare.mobile.csfkym.comC语言的魅力编程语言Cwww.share.tianqiongtech.comC语言的魅力编程语言Cwww.app.tianqiongtech.comC语言的魅力编程语言Cread.share.tianqiongtech.comC语言的魅力编程语言Cwww.blog.tianqiongtech.comC语言的魅力编程语言Cwww.wap.tianqiongtech.comC语言的魅力编程语言Cwww.a.tianqiongtech.comC语言的魅力编程语言Cwww.b.tianqiongtech.comC语言的魅力编程语言Cwww.c.tianqiongtech.comC语言的魅力编程语言Cwww.d.tianqiongtech.comC语言的魅力编程语言Cnews.tianqiongtech.comC语言的魅力编程语言Cm.blog.tianqiongtech.comC语言的魅力编程语言Cwww.cctv.tianqiongtech.comC语言的魅力编程语言Cwww.mobile.tianqiongtech.comC语言的魅力编程语言Cm.mobile.tianqiongtech.comC语言的魅力编程语言Cm.cctv.tianqiongtech.comC语言的魅力编程语言Cwww.news.tianqiongtech.comC语言的魅力编程语言Cshare.news.tianqiongtech.comC语言的魅力编程语言Cshare.wap.tianqiongtech.comC语言的魅力编程语言Cshare.read.tianqiongtech.comC语言的魅力编程语言Cshare.blog.tianqiongtech.comC语言的魅力编程语言Cshare.cctv.tianqiongtech.comC语言的魅力编程语言Cshare.mobile.tianqiongtech.comC语言的魅力编程语言Cwww.share.dnj999.comC语言的魅力编程语言Cwww.app.dnj999.comC语言的魅力编程语言Cread.share.dnj999.comC语言的魅力编程语言Cwww.blog.dnj999.comC语言的魅力编程语言Cwww.wap.dnj999.comC语言的魅力编程语言Cwww.a.dnj999.comC语言的魅力编程语言Cwww.b.dnj999.comC语言的魅力编程语言Cwww.c.dnj999.comC语言的魅力编程语言Cwww.d.dnj999.comC语言的魅力编程语言Cnews.dnj999.comC语言的魅力编程语言Cm.blog.dnj999.comC语言的魅力编程语言Cwww.cctv.dnj999.comC语言的魅力编程语言Cwww.mobile.dnj999.comC语言的魅力编程语言Cm.mobile.dnj999.comC语言的魅力编程语言Cm.cctv.dnj999.comC语言的魅力编程语言Cwww.news.dnj999.comC语言的魅力编程语言Cshare.news.dnj999.comC语言的魅力编程语言Cshare.wap.dnj999.comC语言的魅力编程语言Cshare.read.dnj999.comC语言的魅力编程语言Cshare.blog.dnj999.comC语言的魅力编程语言Cshare.cctv.dnj999.comC语言的魅力编程语言Cshare.mobile.dnj999.comC语言的魅力编程语言Cwww.share.ohshipin.comC语言的魅力编程语言Cwww.app.ohshipin.comC语言的魅力编程语言Cread.share.ohshipin.comC语言的魅力编程语言Cwww.blog.ohshipin.comC语言的魅力编程语言Cwww.wap.ohshipin.comC语言的魅力编程语言Cwww.a.ohshipin.comC语言的魅力编程语言Cwww.b.ohshipin.comC语言的魅力编程语言Cwww.c.ohshipin.comC语言的魅力编程语言Cwww.d.ohshipin.comC语言的魅力编程语言Cnews.ohshipin.comC语言的魅力编程语言Cm.blog.ohshipin.comC语言的魅力编程语言Cwww.cctv.ohshipin.comC语言的魅力编程语言Cwww.mobile.ohshipin.comC语言的魅力编程语言Cm.mobile.ohshipin.comC语言的魅力编程语言Cm.cctv.ohshipin.comC语言的魅力编程语言Cwww.news.ohshipin.comC语言的魅力编程语言Cshare.news.ohshipin.comC语言的魅力编程语言Cshare.wap.ohshipin.comC语言的魅力编程语言Cshare.read.ohshipin.comC语言的魅力编程语言Cshare.blog.ohshipin.comC语言的魅力编程语言Cshare.cctv.ohshipin.comC语言的魅力编程语言Cshare.mobile.ohshipin.comC语言的魅力编程语言Cwww.share.jlcastor.comC语言的魅力编程语言Cwww.app.jlcastor.comC语言的魅力编程语言Cread.share.jlcastor.comC语言的魅力编程语言Cwww.blog.jlcastor.comC语言的魅力编程语言Cwww.wap.jlcastor.comC语言的魅力编程语言Cwww.a.jlcastor.comC语言的魅力编程语言Cwww.b.jlcastor.comC语言的魅力编程语言Cwww.c.jlcastor.comC语言的魅力编程语言Cwww.d.jlcastor.comC语言的魅力编程语言Cnews.jlcastor.comC语言的魅力编程语言Cm.blog.jlcastor.comC语言的魅力编程语言Cwww.cctv.jlcastor.comC语言的魅力编程语言Cwww.mobile.jlcastor.comC语言的魅力编程语言Cm.mobile.jlcastor.comC语言的魅力编程语言Cm.cctv.jlcastor.comC语言的魅力编程语言Cwww.news.jlcastor.comC语言的魅力编程语言Cshare.news.jlcastor.comC语言的魅力编程语言Cshare.wap.jlcastor.comC语言的魅力编程语言Cshare.read.jlcastor.comC语言的魅力编程语言Cshare.blog.jlcastor.comC语言的魅力编程语言Cshare.cctv.jlcastor.comC语言的魅力编程语言Cshare.mobile.jlcastor.comC语言的魅力编程语言Cwww.share.hixforever.comC语言的魅力编程语言Cwww.app.hixforever.comC语言的魅力编程语言Cread.share.hixforever.comC语言的魅力编程语言Cwww.blog.hixforever.comC语言的魅力编程语言Cwww.wap.hixforever.comC语言的魅力编程语言Cwww.a.hixforever.comC语言的魅力编程语言Cwww.b.hixforever.comC语言的魅力编程语言Cwww.c.hixforever.comC语言的魅力编程语言Cwww.d.hixforever.comC语言的魅力编程语言Cnews.hixforever.comC语言的魅力编程语言Cm.blog.hixforever.comC语言的魅力编程语言Cwww.cctv.hixforever.comC语言的魅力编程语言Cwww.mobile.hixforever.comC语言的魅力编程语言Cm.mobile.hixforever.comC语言的魅力编程语言Cm.cctv.hixforever.comC语言的魅力编程语言Cwww.news.hixforever.comC语言的魅力编程语言Cshare.news.hixforever.comC语言的魅力编程语言Cshare.wap.hixforever.comC语言的魅力编程语言Cshare.read.hixforever.comC语言的魅力编程语言Cshare.blog.hixforever.comC语言的魅力编程语言Cshare.cctv.hixforever.comC语言的魅力编程语言Cshare.mobile.hixforever.comC语言的魅力编程语言Cwww.share.zztradinghk.comC语言的魅力编程语言Cwww.app.zztradinghk.comC语言的魅力编程语言Cread.share.zztradinghk.comC语言的魅力编程语言Cwww.blog.zztradinghk.comC语言的魅力编程语言Cwww.wap.zztradinghk.comC语言的魅力编程语言Cwww.a.zztradinghk.comC语言的魅力编程语言Cwww.b.zztradinghk.comC语言的魅力编程语言Cwww.c.zztradinghk.comC语言的魅力编程语言Cwww.d.zztradinghk.comC语言的魅力编程语言Cnews.zztradinghk.comC语言的魅力编程语言Cm.blog.zztradinghk.comC语言的魅力编程语言Cwww.cctv.zztradinghk.comC语言的魅力编程语言Cwww.mobile.zztradinghk.comC语言的魅力编程语言Cm.mobile.zztradinghk.comC语言的魅力编程语言Cm.cctv.zztradinghk.comC语言的魅力编程语言Cwww.news.zztradinghk.comC语言的魅力编程语言Cshare.news.zztradinghk.comC语言的魅力编程语言Cshare.wap.zztradinghk.comC语言的魅力编程语言Cshare.read.zztradinghk.comC语言的魅力编程语言Cshare.blog.zztradinghk.comC语言的魅力编程语言Cshare.cctv.zztradinghk.comC语言的魅力编程语言Cshare.mobile.zztradinghk.comC语言的魅力编程语言Cwww.share.qtjyart.comC语言的魅力编程语言Cwww.app.qtjyart.comC语言的魅力编程语言Cread.share.qtjyart.comC语言的魅力编程语言Cwww.blog.qtjyart.comC语言的魅力编程语言Cwww.wap.qtjyart.comC语言的魅力编程语言Cwww.a.qtjyart.comC语言的魅力编程语言Cwww.b.qtjyart.comC语言的魅力编程语言Cwww.c.qtjyart.comC语言的魅力编程语言Cwww.d.qtjyart.comC语言的魅力编程语言Cnews.qtjyart.comC语言的魅力编程语言Cm.blog.qtjyart.comC语言的魅力编程语言Cwww.cctv.qtjyart.comC语言的魅力编程语言Cwww.mobile.qtjyart.comC语言的魅力编程语言Cm.mobile.qtjyart.comC语言的魅力编程语言Cm.cctv.qtjyart.comC语言的魅力编程语言Cwww.news.qtjyart.comC语言的魅力编程语言Cshare.news.qtjyart.comC语言的魅力编程语言Cshare.wap.qtjyart.comC语言的魅力编程语言Cshare.read.qtjyart.comC语言的魅力编程语言Cshare.blog.qtjyart.comC语言的魅力编程语言Cshare.cctv.qtjyart.comC语言的魅力编程语言Cshare.mobile.qtjyart.comC语言的魅力编程语言Cwww.share.gyy-tech.comC语言的魅力编程语言Cwww.app.gyy-tech.comC语言的魅力编程语言Cread.share.gyy-tech.comC语言的魅力编程语言Cwww.blog.gyy-tech.comC语言的魅力编程语言Cwww.wap.gyy-tech.comC语言的魅力编程语言Cwww.a.gyy-tech.comC语言的魅力编程语言Cwww.b.gyy-tech.comC语言的魅力编程语言Cwww.c.gyy-tech.comC语言的魅力编程语言Cwww.d.gyy-tech.comC语言的魅力编程语言Cnews.gyy-tech.comC语言的魅力编程语言Cm.blog.gyy-tech.comC语言的魅力编程语言Cwww.cctv.gyy-tech.comC语言的魅力编程语言Cwww.mobile.gyy-tech.comC语言的魅力编程语言Cm.mobile.gyy-tech.comC语言的魅力编程语言Cm.cctv.gyy-tech.comC语言的魅力编程语言Cwww.news.gyy-tech.comC语言的魅力编程语言Cshare.news.gyy-tech.comC语言的魅力编程语言Cshare.wap.gyy-tech.comC语言的魅力编程语言Cshare.read.gyy-tech.comC语言的魅力编程语言Cshare.blog.gyy-tech.comC语言的魅力编程语言Cshare.cctv.gyy-tech.comC语言的魅力编程语言Cshare.mobile.gyy-tech.comC语言的魅力编程语言Cwww.share.bdsedu.cnC语言的魅力编程语言Cwww.app.bdsedu.cnC语言的魅力编程语言Cread.share.bdsedu.cnC语言的魅力编程语言Cwww.blog.bdsedu.cnC语言的魅力编程语言Cwww.wap.bdsedu.cnC语言的魅力编程语言Cwww.a.bdsedu.cnC语言的魅力编程语言Cwww.b.bdsedu.cnC语言的魅力编程语言Cwww.c.bdsedu.cnC语言的魅力编程语言Cwww.d.bdsedu.cnC语言的魅力编程语言Cnews.bdsedu.cnC语言的魅力编程语言Cm.blog.bdsedu.cnC语言的魅力编程语言Cwww.cctv.bdsedu.cnC语言的魅力编程语言Cwww.mobile.bdsedu.cnC语言的魅力编程语言Cm.mobile.bdsedu.cnC语言的魅力编程语言Cm.cctv.bdsedu.cnC语言的魅力编程语言Cwww.news.bdsedu.cnC语言的魅力编程语言Cshare.news.bdsedu.cnC语言的魅力编程语言Cshare.wap.bdsedu.cnC语言的魅力编程语言Cshare.read.bdsedu.cnC语言的魅力编程语言Cshare.blog.bdsedu.cnC语言的魅力编程语言Cshare.cctv.bdsedu.cnC语言的魅力编程语言Cshare.mobile.bdsedu.cnC语言的魅力编程语言Cwww.share.xzdlawyer.comC语言的魅力编程语言Cwww.app.xzdlawyer.comC语言的魅力编程语言Cread.share.xzdlawyer.comC语言的魅力编程语言Cwww.blog.xzdlawyer.comC语言的魅力编程语言Cwww.wap.xzdlawyer.comC语言的魅力编程语言Cwww.a.xzdlawyer.comC语言的魅力编程语言Cwww.b.xzdlawyer.comC语言的魅力编程语言Cwww.c.xzdlawyer.comC语言的魅力编程语言Cwww.d.xzdlawyer.comC语言的魅力编程语言Cnews.xzdlawyer.comC语言的魅力编程语言Cm.blog.xzdlawyer.comC语言的魅力编程语言Cwww.cctv.xzdlawyer.comC语言的魅力编程语言Cwww.mobile.xzdlawyer.comC语言的魅力编程语言Cm.mobile.xzdlawyer.comC语言的魅力编程语言Cm.cctv.xzdlawyer.comC语言的魅力编程语言Cwww.news.xzdlawyer.comC语言的魅力编程语言Cshare.news.xzdlawyer.comC语言的魅力编程语言Cshare.wap.xzdlawyer.comC语言的魅力编程语言Cshare.read.xzdlawyer.comC语言的魅力编程语言Cshare.blog.xzdlawyer.comC语言的魅力编程语言Cshare.cctv.xzdlawyer.comC语言的魅力编程语言Cshare.mobile.xzdlawyer.comC语言的魅力