函数指针的使用——提供灵活性!

例子:

一开始设计了一个在数组中查找是否存在某个值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)


这样,两种情况互不冲突,不必修改函数内部代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值