为什么不需要给回调函数传递参数

描述

回调函数是C语言里面一个重要机制。

关于回调函数,好多同学存在一个问题,使用回调函数的时候,为什么不需要给函数传递参数?

比如这样一个代码:

 

#include 


void 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 函数。

所以回调函数在使用的时候,千万不能传参,加上括号,意思就变了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分