:不同语言实现回调的方式有不同函数的指针

在计算机编程中,回调函数,或简称回调,是指对通过函数参数传递给其他代码的可执行代码块的引用。这种设计允许低层代码调用在高层定义的子程序。

这句话不是那么好理解,不同语言实现回调的方式略有不同。其实可以这样理解,回调就是在一个函数中调用另一个函数。

图片[1]-:不同语言实现回调的方式有不同函数的指针-4747i站长资讯

在 C 中,回调是使用函数指针实现的。函数指针 – 顾名思义,指向函数的指针。通常函数指针有两种使用方式,一种是跳转表,另一种是作为参数传递给函数。

下面是两个函数指针的声明: int(*f)(int,float);int*(*g[])(int,float);

前者将 f 声明为函数指针,它所引用的函数接受两个参数,一个整数值和一个浮点值,并返回一个整数值。

后者将 g 声明为一个数组。数组的元素类型是函数指针。它指向的函数接受两个参数,一个整数值和一个浮点值,并返回一个整数指针。

图片[2]-:不同语言实现回调的方式有不同函数的指针-4747i站长资讯

需要注意的是,简单地声明一个函数指针并不意味着它可以立即使用。与其他指针一样,函数指针必须在对其执行间接寻址之前初始化为指向函数。以下代码片段说明了一种初始化函数指针的方法。

intf(int);int(*pf)(int) = f;

第二个声明创建函数指针 pf 并将其初始化为指向函数 f。函数指针的初始化也可以通过赋值语句来完成。在函数指针初始化之前有f的原型很重要,否则编译器无法检查f的类型是否与pf指向的类型匹配。

用一个例子简单介绍一下回调函数的使用

大家应该对C语言中的库函数qsort有所了解。qsort 声明如下:

void qsort(void*base,,,int(*)(*,*))

可以看到,它的第三个参数是一个函数指针,传入两个没有定义指针所指类型的参数a和b,返回一个整数值。实际上这里使用了回调函数。使用回调函数,qsort 可以在运行时调用用户定义的函数(低级代码调用在高级定义的子例程)。

图片[3]-:不同语言实现回调的方式有不同函数的指针-4747i站长资讯

这里我们设计一个简单的排序函数来理解回调过程

1、定义函数指针

(*)(*a,*b);

2、自定义排序功能,为简单起见,这里使用冒泡排序

int*sort(int*nums,intn, cmp)}};}

图片[4]-:不同语言实现回调的方式有不同函数的指针-4747i站长资讯

3、 实现函数回调

####(*)(*a,*b);//定义实现回调函数的“调用函数” int*sort(int*nums,intn, cmp)}};}

// 定义回调函数 (inta,intb)(,*argv[]);int*x= (a,7, cmp1);for(inti =0; i

运行结果:

1

1 1 3 4 4 5 10

图片[5]-:不同语言实现回调的方式有不同函数的指针-4747i站长资讯

调用函数将 int (*)(const int *a, const int *b) 传递给它的函数;这是int cmp1(int a, int b)函数的入口地址c语言子函数调用,也就是PC指针移动到这个地址就可以执行int cmp1(int a, int b)函数可以类比数组来理解。

在函数调用的实现中,函数调用“调用函数”,然后进一步调用其中的“被调用函数”。与直接调用“被调用函数”的主函数相比,该方法为用户提供了灵活的接口,而不是为开发者。此外,函数入口可以像变量一样设置c语言子函数调用,这也为开发者提供了灵活性。

文章来源:https://new.qq.com/omn/20201202/20201202A0GRU400.html

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享