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