对函数指针了解吗?了解全部都简略了! 好书引荐《C圈套与缺点》《C专家编程》看看就上个层次就不是菜鸟了,呵呵
(*(void(*)())0) ();//便是它了! 晕了吗?没晕,不错不错,大哥,你扎这凶猛呢!
((void(*)())0) ();//假如这样写呢!
(**(void(*)())0) ();//假如这样写呢!
有差异吗?看下面比如
#include
void fun() { }
int main() { printf(“%p%p%p/n”, &fun, fun, *fun); return 0; } 看看成果是否大吃一惊// 没有,大哥你扎这凶猛呀
假定fp是个float指针,声明如下 float * fp; 把0强制转换成一个float指针(把变量fp去掉就能够了) (float *)0;
相似: 假定fp是函数指针为void类型的函数的指针),声明如下: void (*fp)(); 把0强制转换成该函数指针(变量fp去掉就能够了) (void(*)())0
最后用(void(*)())0替代fp,然后得到调用的用法
(*(void(*)())0) ();
单片机我是这样写的 ((void(code *)(void))0x0000)();//简略,证明能够 (*(void(code *)(void))0x0000)();//这样行吗
是不是看的很费事,typedef来帮助呀(为杂乱的声明界说一个新的简略的别号),这不这个大哥来了
typedef void (code *pfunction)(void); //相当于pfunction变成了一个函数指针的类型(和float意义相同,只不过flaot表明的是一个指向浮点的指针,而pfunction表明一个指向函数的指针)
((function)0xE800)();//这样行吗 (*(function)0xE800)(); //这样行吗
下面是我在ARM下用过的 typedef void (*pfunction)(void);
void FMI_Jump(void) { pfunction jump; jump=(pfunction)(0x80000); jump();
}
跳转PC,都是用来在线晋级时分,什么什么你没用过,大哥你扎这走运呢,想当初我带着烧写器做火车,一个电信机房一个电信机房的跑,苦楚呀!
留意:跳转复位PC风险!!!!它仅仅PC从000开端,内部寄存器并未回到复位值,所以程序初始化一定要完全,全部体系资源都要初始化,哪怕未用!!!主张最好关狗,等RESET复位较安全(什么什么我用PC跳转没遇到问题啊?大哥你扎这走运呢!^_^) |