楼主何必把他理解得这么复杂呢。你函数指针搞不懂,那就说明你指针根本不清楚。让小生慢慢为你道来:
指针他就是一种特殊的变量,不管是多少重指针,不管是什么类型,他就在内存中占4个字节。
EG:
char********************* p
//占4字节
int*****
p
//占4字节
char*
//4字节
int*
//4字节
当然我们这里说的是32位操作系统下。
函数指针,其实他也只占4个字节。他也是个变量。他起名“函数指针”难道他一定得是函数的开始地址吗?我把他指
向别的地方难道就错了吗?当然不会。
我们来看一个例子:
#include "stdafx.h"
int func(int a,int b)
{
int* (*p)(int a,int b);
//定义一个函数指针p,
int* buffer[0x100];
//定义一个BUF,里面装我们的要填充的CODE
int nResult;
//存储我们P指向的“函数”返回值,这里函数指了引号,想必大家知道为什么了。
buffer[0]=(int*)0x0424448b;
//buf里面的内容如果会汇编的话应该很明白在下面我们做了解释
buffer[1]=(int*)0x08244403;
buffer[2]=(int*)0xc3;
p = (int*(*)(int a,int b))&buffer[0];
//把buffer的地址给了函数指针。
nResult = (int)p(7,8);
//现在我们就跳到buffer的地址去执行了,由于我们在buffer里填的机器码是对参数a,b做加法,所以返回给nresult的时候是a,b的和
printf("%d\n",nResult);
return nResult;
}
int main(int argc, char* argv[])
{
func(1,2);
printf("Hello World!\n");
return 0;
}
//int* buffer[0x100];里面的内容。就是对a和b做了加法。
0012FB20 8B 44 24 04
mov
eax,dword ptr [esp+4]
0012FB24 03 44 24 08
add
eax,dword ptr [esp+8]
0012FB28 C3
ret
//这是我注册这里的一次发贴。。。。
[
本帖最后由 HuErr 于 2012-1-19 10:23 编辑 ]
收到的鲜花