函数指针也就是
指向函数的指针。
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语言中,函数本身不是变量,但可以定义为指向函数的指针。这种类型的指针可以被赋值、存在数组中、传递给函数以及作为函数的返回值等等。
分享到:
相关推荐
我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面 的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10] def是什么? (2)double*(*gh)[10] gh是什么? (3)double...
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
指针函数和函数指针变量指针 函数和函数指针变量
C/C++ 函数指针的意义,函数指针的用法
一、函数指针的定义 顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * ...
C++中一般函数指针和类的成员函数指针的区别
本文叙述了函数指针和指针函数的区别,防止程序员混淆两者。
C语言指针函数和函数指针详细介绍.
易语言简单类函数指针源码,简单类函数指针,创建线程,取类函数指针,类函数,娃哈哈,CreateThread,SetWindowTextA
函数指针和指针函数的区别,以及const的用法,指针常量,常量指针的用法
在C++中,函数指针一般是指全局命名空间中的函数指针,类成员函数指针,与函数指针不同的是,类具有类域操作符,在声明类成员函数指针的时候,要指定成员函数返回值类型、类域操作符、成员函数参数列表
c++的指针特性学习之函数指针,代码中给出了函数指针的声明方式和使用方式,供大家使用函数指针参考
详解函数指针和指针函数 函数类型 (*指针变量名)(形参列表); “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的...
单片机Keil C51中函数指针的使用,这个东西不错的,至少我觉得不错啊,
函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用...
函数指针&回调函数培训讲义,帮助学习函数指针以及回调函数。
里面包含: 普通函数指针,同一个类函数指针,不同类的函数指针的使用。
指针 函数指针 (全局函数/类成员函数)和函数对象
函数指针是C语言中几个难点之一。由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服。主要由于函数变量的传递。
用一个函数指针来交换两个数