`
clouisandy
  • 浏览: 19772 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

函数指针

 
阅读更多
函数指针也就是指向函数的指针
c语言里搞出这么个东西,虽然有其灵活性,但是用起来挺纠结的。说也说不大明白,举个例子就明白了:
我们现在要做排序,那排序的规则有很多种,比如按字母的顺序排序,比如按数字大小排序....可以为每种排序都写一个函数,但是两种排序方式有很多重复代码,除了最里层的“比较函数”不一样,其余的部分都是一样的。
当然我们可以用if else,这样可以解决问题。函数指针呢是另一种解决方案,我们可以写出各种“比较函数”,比如strcmp,numcmp....,然后将这些函数的指针传递给排序函数sort,当比较的时候调用即可。下面上代码:
第一部分是声明:
void sort(void *linepter[],int left,int right,int (*comp)(void *,void *));
int numcmp(char *,char *);
int strcmp(char *,char *);

注意sort的最后一个参数“(*comp)(void *,void *)”,它表明comp是一个指向函数的指针,该函数具有两个void*类型的参数,它的返回值是int。顺便说一句void*类型是通用指针类型,用了它任何类型的指针都可以接收。
第二部分看看sort中如何使用:
sort(char *v[],int left,int right,int (*comp)(void *,void *)){
	int i,last;

	if(left>=right){
		return;
	}

	swap(v,left,(left+right)/2);
	last = left;

	for(i=left+1;i<=right;i++){
		if((*comp)(v[i],v[left])<0){
			swap(v,++last,i);
		}
	}

	swap(v,left,last);
	sort(v,left,last-1,comp);
	sort(v,last+1,right,comp);

}

看上面的if((*comp)(v[i],v[left])<0){...} 使用上跟正常的函数区别不大,但要注意两点:
1、*comp是函数指针所指向的函数,同指针的用法,这里不多说。
2、(*comp)括号要加上的,因为*的优先级比较低,不加的话就变成了返回一个int指针了
第三部分来看在main方法中的调用
int numeric = 0;

main(int argc,char * args[])
{
	char *ss[100];
	int i;

	for(i=0;i<argc;i++){
		if(strcmp(args[1],"-n") == 0){
			numeric = 1;
		}	
         }

         ....
	sort(ss,0,lines-1,(int (*)(void*,void*))(numeric?numcmp:strcmp));

}

其他部分无需关心,我们只看“sort(ss,0,lines-1,(int (*)(void*,void*))(numeric?numcmp:strcmp))”看到最后一个参数了吧,传进入的变量是numcmp或strcmp(还是用了if else,跑不掉的),numcmp或strcmp是指针,前面(int (*)(void*,void*))是个强制转换(这个不加也不会报错)。

总结:
用法就是上面这样了,最后再来看定义在c语言中,函数本身不是变量,但可以定义为指向函数的指针。这种类型的指针可以被赋值、存在数组中、传递给函数以及作为函数的返回值等等。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics