1.C语言中函数的调用可分为直接调用和间接调用(函数指针),具体调用方法如下:
int add(int a,int b)
{
return a+b;
}
void main()
{
add(1,2);//直接函数调用,函数名就是函数的入口地址
//1.定义一个函数类型
typedef int (myAdd1)(int ,int ); //myAdd1就是一个函数类型
myAdd1 *p1=NULL;
p1=&add; //这里写成p1=add也可以,这是因为C编译器是逐渐完善起来的,有兼容历史版本的原因在里面
p1(3,4);//函数的间接调用
//2.定义一个函数指针类型
typedef int (*myAdd2)(int ,int ); //myAdd2就是一个函数指针类型
myAdd2 p2=NULL;
p2=&add;
p2(3,4);//函数的间接调用
//3.直接定义一个函数指针变量
int (*p3)(int ,int ); //myAdd2就是一个函数指针类型
p3=&add;
p3(3,4);//函数的间接调用
}
2.C语言中,函数指针做函数参数的方法:
//函数的具体实现
int add1(int a,int b)
{
return a+b;
}
int add2(int a,int b)
{
return a+b;
}
int add3(int a,int b)
{
return a+b;
}
//函数的调用,实现求1+2的和的功能
int fun(int (*padd)(int,int))
{
padd(1,2);
}
//主函数里面直接调用fun()函数,用一个统一的接口实现想要的功能
void main()
{
fun(add1);
fun(add2);
fun(add3);
}
上面通过函数指针调用函数的方法,使用一种调用形式就可以实现不同函数的调用。这种做法思想上和C++中多态的思想是相同的,好处也非常明显:定义好函数的接口之后,后来人只要根据此接口去填写自己的代码,现在的人不需要改动什么就可以轻松地调用后来人写的代码。
利用函数指针调用函数的精髓在于:函数指针类型提前做了约定。
为了解释这句话的意思,可以对比上面的实例:fun()函数的传入参数,即函数指针padd提前封装好了函数对外的接口,包括函数输入、输出参数的类型、个数(函数add1(),add2(),add3()的类型是一样的)。这样fun()函数就可以利用一个统一的函数指针形参padd去描述函数的操作,相当于把框架搭建好了,函数的调用形式被确定下来了。具体执行的时候,再根据传来的实参去回调具体的函数代码,如add1()、add2()或add3()。因此,fun()函数的传入参数padd就如同是C++中的父类指针,add1(),add2(),add3()就像是C++中的纯虚函数的具体实现。