typedef 返回值类型(* 新类型名称)(参数列表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
pFun = glFun;
(*pFun)(2);
}
调用方式:
上面的PTRFUN也可直接进行以下调用:
PTRFUN(2);
函数名就是函数的地址,是一个编译时的常量,“函数连接”的本质就是把函数地址绑定到函数的调用语句上。
静态连接:一般的函数调用语句可以在编译的时候就完成这个绑定,这就是静态连接。
运行时连接&动态连接:
函数指针可以理解为一个新的类型,由其定义的变量,与其他变量一样,在编译期间是没有值的,因此函数指针与函数体的绑定关系只有到了运行时才确定。
对于函数指针数组,此特征表现的尤为明显,见《高质量程序设计指南》P135
class CTest
{
public:
void f(void){cout<<"CTest::f()"<<endl;} //普通成员函数
static void g(void) {cout<<"CTest::g()"<<endl;} //静态成员函数
virtual void h(void) {cout<<"CTest::h()"<<endl;} //虚拟成员函数
private:
//..........
};
void main()
{
typedef void (*GFPtr)(void); //定义一个全局函数指针类型
GFPtr fp = CTest::g; //取静态成员函数地址的方法和取一个全局函数的地址相似
fp(); //通过函数指针调用类静态成员函数
typedef void (CTest::*MemFuncPtr)(void)//声明类成员函数指针类型
MemFuncPtr mfp_1 = &CTest::f; //声明成员函数指针变量并初始化
MemFuncPtr mfp_2 = &CTest::h; //注意获取成员函数地址的方法
CTest theObj;
(theObj.*mfp_1)(); //使用对象和成员函数指针调用成员函数
(theObj.*mfp_2)();
CTest* pTest = &theObj;
(pTest->*mfp_1)(); //使用对象指针和成员函数指针调用成员函数
(pTest->*mfp_2)();
}
原文:http://www.cnblogs.com/zhehan54/p/5156190.html