量子碗:函数中的参数问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 01:47:32
比如赢者树中的初始化函数
void Initialize(T a[],int size,int(*winner)(T a[],int b, int c));
这个函数的参数最后一个。
winner是一个 函数
我想知道为什么要这样用,不这样用好想也可以,这样用的好处 是什么

这样的最好的好处是:可以模拟OO中的接口实现.在这个例子里面,winner只是一个函数指针,但是实际指向的函数却不是固定的,比如你这次使用1个A算法实现了winner函数,并用在了Initialize中,下次突然觉得A可以被更好的算法B来实现,那么只需要实现B的函数符合winner的格式就可以被Initialize作为参数调用,而不用更改Initialize本身的代码.函数指针还可以用在模拟多态,重载等OO开发方法中,但是这样使用我们是不提倡的,因为代码非常晦涩,你完全可以使用C++来重新用更清晰的语法来实现,但是在C里面,想自由的实现这些方法只有通过函数指针.

这个是指向函数的指针
例如
int (*funcion1)(T a[],int b, int c){
//函数体
}

int (*funcion2)(T a[],int b, int c){
//函数体
}

调用时可以根据情况使用
Initialize(T a[],size,funcion1(T a[],int b, int c);
Initialize(T a[],size,funcion2(T a[],int b, int c);