函数指针实例代码:http://download.csdn.net/detail/wu_123_456/7695817
发现自己基础不扎实,着实难为情.......今天无意看到虚函数,但是忘了函数指针和获取虚函数表地址的相关操作,所以查阅资料进一步巩固。
1.先看代码
class A
{
public:
virtual void f()
{
cout<<"调用该函数的对象的地址是="<<this<<endl<<"A::f"<<endl;
}
};
void main()
{
A a;
a.f();//(1.)使用对象直接调用
typedef void(*pFun)(void);//(2.)定义函数指针
cout<<"对象a的地址:"<<(int *)(&a)<<endl;//(3.)
cout<<"对象a的虚函数表地址:"<<(int *)*(int *)(&a)<<endl;//(4.)
cout<<"虚函数表中第一个函数的地址"<<(pFun)*((int *)*(int *)(&a))<<endl;//(5.)
pFun pf;
pf = (pFun)*((int *)*(int *)(&a));
_asm{
lea ecx,[ebp-4]
}
pf();//通过虚函数表调用f()
}
2.结果显示
3.解析
(一.)在上面代码中a.f();其实是两个过程:首先将对象a的地址隐式传给this指针,保存在ECX寄存器中;再调用虚函数表中的f(),如果函数中用到对象中的数据,对ECX进行访问。
(二.)lea ecx,[ebp-4]主要功能是将this指针保存到ecx寄存器中
(三.)函数指针的分析
这里对函数指针的定义啰嗦一下,可能大家还记得,那就可以忽略这个部分。为甚么上面的函数指针定义是这样typedef void(* pFun)(void);
这个函数指针是跟函数定义有关的。直接举几个例子,一比较一目了然。
void fun(int);//函数
typedef void (*ptr)(int);//函数指针
int add(int a,int b)
typedef int(* pFun)(int,int)
前面是函数返回类型,后面括号里的是函数参数的类型。
(四.)typedef
typedef 原变量类型 别名
简单的函数指针的用法
//形式1:返回类型(*函数名)(参数表)
char(*pFun)(int);
//typedef char(*pFun)(int) //跟上一行功能等同
/*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/
char glFun(int a){return;}
void main()
{
pFun =glFun;
(*pFun)(2);
}
第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。
第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。