函数指针,顾名思义就是指向函数的指针,它与一般的指针有什么不同呢?我觉得,函数指针只是在定义的时候有一点不同,使用的时候,它就是一个指针该怎么用就怎么用。
int (*f)(int,double);
类似于上面的定义式就是函数指针的定义了。
从前往后分析,最前面的int 说明了这个所指向的函数的返回值,显然,这个被指向的函数会返回一个整型的值;(*f)()结构说明了这是一个函数指针,(int,double)说明了这个指针指向的函数的参数形式,即第一个参数是int型,第二个参数是double型,这时,我们脑海里可以想象有一个这样的函数 int function(int a,double b),并且有一个叫 f 的指针指向了这个函数(其实是指向了这个函数段的起始地址)。
有了前面的分析,就不难理解这个定义了 char * (*f)(double,double);

下面再来一个难一点的,int (*g[])(int ,int);首先这肯定是一个指针,但是[]怎么理解呢?按照数组的理解方法,例如int array[9]定义了一个9个元素的数组,每个元素都是int型,以此类推,这是一个函数指针数组,每一个数组元素的类型都是一个函数指针,他们都各自指向一个类似于 int func(int,int)的函数。

如何使用函数指针呢?我们知道,函数名其实就是指向函数代码段的一个指针,因此,f和function都可以看成是一个指针,都指向了内存中同一块代码段,所以,调用f(3,4.5)与function(3,4.5)是一样的,相当于是给原来的函数一个别名吧。当然,f是一个指针,理所当然可以对他进行“间接访问”,即 (*f)(3,4.5)

一般情况下对于函数指针的常见情况也就是以上这些了,那么函数指针到底有什么用呢?
>说实话,我自己写代码到目前为止还没用过函数指针,一方面是我对这个不熟悉,在coding的过程中不能灵活运用;另一方面函数指针可能确实不如其他语法常用,因此,我举一个《C和指针》中类似的例子。

例子一:不用函数指针的实现。

swith(op){

case ‘+’:add(x,y);break;

case ‘-‘:sub(x,y);break;

case ‘*’:mul(x,y);break;

case ‘/’:div(x,y);break;
}

上面的代码实现了模拟一个计算器对于x,y做加减乘除,那么用函数指针如何实现呢?

例子二:用函数指针实现。

首先我们需要声明函数,并对函数指针数组初始化。
double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);

/*声明函数指针数组*/

 

double (*op_fun[4])(double,double)={add,sub,mul,div};
现在我们可以这样使用:
result=op_fun[op](x,y);

OK,以上就是鄙人学习函数指针的一点点心得。

Tags: ,,. 6,377 views
Home

7 Comments so far

Trackbacks/Pingbacks

Leave a comment

Name(required)
Mail (required),(will not be published)
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://blog.nlogn.cn),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.