将函数作为另一个函数的参数的传递方法
在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;
}
可以看出,上面两种方法都只是父函数声明时的形参写法不一样,其他包括父函数调用时的实参等等,完全一样,而且 无论哪种写法,都可以通过函数指针调用 。其实原理都是一样,都是传递的函数指针,只是第二种方法是“隐式”传递函数指针;而另一种方法则是显示传递。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
Muchas gracias. ?Como puedo iniciar sesion?
来访,这特效真卡。