回调函数是C语言里面一个重要机制。
关于回调函数,好多同学存在一个问题,使用回调函数的时候,为什么不需要给函数传递参数?
比如这样一个代码:
#includevoid sort(int a[], int size, int (*p)(int, int)) { int i, j; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - 1 - i; j++) { if (p(a[j], a[j + 1])) { int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } int less(int x, int y) { return (x > y) ? 1 : 0; } int greater(int x, int y) { return (x < y) ? 1 : 0; } int main() { int a[10] = {1, 0, 4, 7, 2, 9, 5, 3, 8, 6}; sort(a, 10, greater); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } printf(" "); return 0; }
我们模仿C语言的 qsort 函数,实现了一个冒泡排序算法,它既能从小到大排序,也能从大到小排序,取决与最后一个参数。
sort(a, 10, greater);
这个参数既可以是 greater,也可以是 less,很显然,greater 或者 less 都是一个函数。
那么问题来了,这个地方使用 greater,为什么不需要给 greater 传递两个参数,写成这样:
sort(a, 10, greater(1, 2));
如果写成这样,那就大错特错。这个意思是,先调用 greater,把函数的返回值作为 sort 的第三个参数,要么是 0 要么 1。
很显然,这边要求第三个参数是指针,传 0 或者 1 肯定不行。
那使用 greater 函数的时候,两个参数是如何传过去的?
其实这个地方只需要提供一个地址,就是接下来要调用的函数在哪?而函数名刚好就是函数的入口地址。
在 sort 函数内部,会通过这个地址来调用函数,就是这行代码,不是直接调用 greater,而是通过函数指针来调用,同时给他传递了两个参数。
如果调用 sort 的时候,传递的是 less,那函数指针 p 就指向了函数 less,这里就相当于间接调用了 less 函数。
所以回调函数在使用的时候,千万不能传参,加上括号,意思就变了。
全部0条评论
快来发表一下你的评论吧 !