例子:
一开始设计了一个在数组中查找是否存在某个值x的函数,如下:
//比较两个数是否相等
int compare(int a,int b){
if(a == b) return 1;
else return 0;
}
//查找数组中是否存在x
int fun1(int L[10],x) {
int i;
for(i=0;i < 10;++i){
if(compare(L[i],x)) return 1;
}
return 0;
}
此时若想修改为查找数组中是否有比x大的数,有几种方法。
法一:修改compare函数,a == b改为 a>b
缺点:如果在其他的地方,有对compare函数的调用,且目地是为了比较两个数是否相等,则那些调用会受到影响。
法二:再写一个compare2函数,完成比较 a>b 的功能,并修改fun1里的compare为compare2
缺点:如果在其他的地方,有对fun1函数的调用,且目地是为了查找数组中是否存在x,则那些调用会受到影响。
法三:利用函数指针的写法
//用函数指针做形参
int fun1(int L[10],x,int (*compare)(int a,int b)) {
int i;
for(i=0;i < 10;++i){
if(compare(L[i],x)) return 1;
}
return 0;
}
调用时,函数fun1的作用是灵活的,视你选择了compare还是compare2而定
//查找数组中是否存在15
typedef int(*cmp)(ElemType,ElemType);
cmp cmp1;
cmp1 = &compare;
LocateElem_Sq(sqlist1,15,cmp1)
//查找数组中是否存在大于15的元素
typedef int(*cmp)(ElemType,ElemType);
cmp cmp1;
cmp1 = &compare2;
LocateElem_Sq(sqlist1,15,cmp1)
这样,两种情况互不冲突,不必修改函数内部代码。