在C语言中,将一个函数作为参数传递广泛的应用在回调,事件等应用上。有两种方法,但都大同小异。

先来给出两个子函数,下面进行调用。

//此函数没有参数
void Visit1()
{
    printf(" %s ","Visit1");
}
//此函数有一个参数
void Visit2(DataType item)
{
    printf(" Visit2_%d ",item);
}

第一种方法:直接传递函数指针:

/*分别用两个父函数调用子函数*/
//传递一个无参函数指针
void printVisit1(void(*visit)())
{
    visit();
    (*visit)();  //也可以这样调用
}
//传递一个有参函数指针
void printVisit2(void(*visit)(DataType),DataType item)
{
    visit(item);  //可以这样传递参数
    (*visit)(item);  //还可以这样调用
}

在主程序调用上面两个父函数

#include <stdio.h>
typedef int DataType;
int main()
{
    printVisit1(Visit1);     //子函数名作父函数实参
    printVisit2(Visit2,10);     //子函数名作父函数实参

    void (*pf)() = &Visit1;//定义函数指针
    printVisit1(*pf);  //将函数指针作实参

    return 0;
}

第二种方法:

void printVisit_1(void visit())
{
    visit();
    (*visit)();  //仍然可以用指针调用
}
void printVisit_2(void visit(DataType),DataType item)
{
    visit(item);
    (*visit)(item);  //仍然可以用指针调用
} 

主函数调用父函数

#include <stdio.h>
typedef int DataType;
int main()
{
    printVisit_1(Visit1);   //子函数名作父函数实参
    printVisit_2(Visit2,10);   //子函数名作父函数实参

    void (*pf)() = &Visit1;//定义函数指针
    printVisit_1(*pf);  //将函数指针作实参

    return 0;
}

可以看出,上面两种方法都只是父函数声明时的形参写法不一样,其他包括父函数调用时的实参等等,完全一样,而且 无论哪种写法,都可以通过函数指针调用 。其实原理都是一样,都是传递的函数指针,只是第二种方法是“隐式”传递函数指针;而另一种方法则是显示传递。