1.函数指针的定义方式如下:
<返回类型> (*<指针名>) (<形参列表>)
比如定义了一个函数指针为 int (*p) (int x);
p表示一个函数指针,它指向接受一个int型形参的函数,这个函数的返回类型为int .
这里要注意的是它不能写成 int *p(int x),这时p不再是函数指针,而是一个函数名,它接受int类型形参,返回类型为指向int类型的指针
如果用typedef定义简化函数指针定义,可用
typedef int (*p) (int x);
p p1;
这样就可以定义函数指针p1.,这样做的好处在于,如果要定义多个函数指针,这样可以更加简便。
2.函数指针的调用
假如有函数int f(int x);
定义函数指针为 int (*p)(int x);
函数f的调用方式有以下三种
a=f(1); //函数名调用
a=(*p)(1); //使用指针的间接访问操作
a=p(1); //间接访问并不是必须的
下面是调用函数指针的代码:
# include <iostream> using namespace std; # include <stdlib.h> int main() { int f(int x); int (*p)(int x); p=f; cout<<p(4)<<endl; cout<<f(4)<<endl; cout<<(*p)(4)<<endl; //函数指针的调用方式 system("pause"); return 0; } int f(int x) { return x*x; }
需要注意的是,上面使用了 int f(4),p(4)和(*p)(4)的调用方式,也可以使用int (*f)(4)的形式,效果与以上结果完全相同,这也说明了函数名实际上函数的入口地址,在将入口地址赋值给函数指针的时候,用p=&f和p=f的效果完全相同。
3.函数指针的用途
这里介绍函数指针用于跳转表,以简化代码
假设要编写程序,实现四种操作,分别是0.上移,1.下移,2.左移,3.右移,可以采用switch case的结构,
int x;
switch (c)
{
case 0:
up(x);break;
case 1:
down(x);break;
case 2:
left(x);break;
case 3:
right(x);break;
}
如果操作增加,比如有一百种操作,这个switch case结构将会很庞大,可以用跳转表简化这段代码,这里需要用函数指针数组。
首先声明这四个函数, void up(int x);
void down(int x);
void left(int x);
void right(int x);
定义函数指针数组 void (*p[ ])={up,down,left,right};
这样,如果是调用up函数,只要用p[0](int x);
下面是实现的代码:
# include <iostream> using namespace std; # include <stdlib.h> int main() { void up(int x); void down(int x); void left(int x); void right(int x); void (*p[])(int x)={up,down,left,right}; //定义函数指针数组,分别指向四个函数 cout<<"input the operation:"<<endl; cout<<"0:up"<<endl; cout<<"1:down"<<endl; cout<<"2:left"<<endl; cout<<"3:right"<<endl; int c; cin>>c; cout<<"input the distance"<<endl; int x; cin>>x; p[c](x); system("pause"); return 0; } void up(int x) { cout<<x<<" meters up"<<endl; } void down(int x) { cout<<x<<" meters down"<<endl; } void left(int x) { cout<<x<<" meters left"<<endl; } void right(int x) { cout<<x<<" meters right"<<endl; }
从以上的例子可以看出,跳转表大大简化了代码量,替换了switch case结构,这是函数指针的强大功能。
2.成员函数指针
类中成员函数也可以定义函数指针,方式如下:<返回类型> (<类名>::*<指针名>) 如:
int (A::* p) (); 它定义了一个成员函数指针p,p指向的函数形参表为空,返回值为int型。
成员函数的使用方式为,假设a为A类型的对象,a.get()或(a.*p).get()都可以调用函数get(),如果*a是A类型的对象,a->get();和(a->*p)()都可以调用函数get()
下面是代码:
# include <iostream> using namespace std; class A { public: A(int i):x(i){} int get(){return x;} private: int x; }; int main() { A a(1); int (A::*p) (); p=&A::get; a.get(); (a.*p)(); //成员函数指针调用方式 A *b=&a; b->get(); (b->*p)(); cin.get(); return 0; }
原文:http://blog.csdn.net/u011608357/article/details/18840551