1.问题背景
之前调试某个程序的时候师哥在程序里加了这样一段函数就能正常运行了,这段
uint16 StartAddress;
void Execute()
{
StartAddress=*((uint16 *)0xEFFE);
( ( void(*)(void) )StartAddress )(); //void(*)(void) 是函数指针
}
这段程序的作用是跳转到0XEFFE地址中执行该地址中的内容
2.分析
其中出现了函数指针void(*)(void) ,要明白函数指针首先要明白如何定义一个函数指针,那么就要先明白定义函数指针的类型是什么(比如要定义一个参数a,可以写int a,就得到一个int类型的变量a )
很清楚可以得到这样一个结论,在定义a的语句int a;中,去掉变量名留下的就是该变量的类型
因此对于函数的定义,去掉函数名字留下的就是该函数的类型:
比如定义一个函数
int fun(int x, int y)
去掉函数名字fun剩下的 int (int x, int y) 就是该函数的类型,那么接下来就要使用该类型去定义一个指针,就是函数类型的指针即函数指针,按照以往定义指针变量的方法,一般是把类型名放在新定义的指针变量前面,例如int *a,但是对于函数指针要按以下方式,这是定义函数类型指针的一个特殊地方
要写成int (*P) (int x, int y) 而不是int (int x, int y)(*P)
这样就得到了一个类型为int (int x, int y)的指针P
那我们就用void fun(void) 这个函数的类型去定义一个函数类型的指针:
void(*P)(void);
其返回值和参数的类型与原先函数的一致,
3.回马枪
那这个void(*)(void)是个什么东西?它与void(*p)(void)和void (void)二者的区别在哪?
其实我理解这三个可以分别类比于int* int*p 和 int
这样就好理解了吧
void (void) :这是一个函数的类型
void(*)(void) :这是函数指针类型 可以用于定义一个新的函数指针变量
void(*p)(void):这是用上一个函数指针类型定义了一个变量p,即得到一个返回值void和参数为void的函数指针变量p
4.总结
写的有不完整的地方大家多多指正