对函数指针熟悉吗?熟悉一切都容易了!
好书推荐《C陷阱与缺陷》《C专家编程》看看就上个档次就不是菜鸟了,呵呵
(*(void(*)())0)();//就是它了!
晕了吗?没晕,不错不错,大哥,你扎这厉害呢!
((void(*)())0)();//如果这样写呢!
(**(void(*)())0)();//如果这样写呢!
有区别吗?看下面例子
#includestdio.h>
voidfun()
{
}
intmain()
{
printf(%p%p%p ,fun,fun,*fun);
return0;
}
看看结果是否大吃一惊//没有,大哥你扎这厉害呀
假设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来帮忙呀(为复杂的声明定义一个新的简单的别名),这不这个大哥来了
typedefvoid(code*pfunction)(void);
//相当于pfunction变成了一个函数指针的类型(和float含义一样,只不过flaot表示的是一个指向浮点的指针,而pfunction表示一个指向函数的指针)
((function)0xE800)();//这样行吗
(*(function)0xE800)();//这样行吗
下面是我在ARM下用过的
typedefvoid(*pfunction)(void);
voidFMI_Jump(void)
{
pfunctionjump;
jump=(pfunction)(0x80000);
jump();
}
跳转PC,都是用来在线升级时候,什么什么你没用过,大哥你扎这幸运呢,想当初我带着烧写器做火车,一个电信机房一个电信机房的跑,痛苦呀!
注意:跳转复位PC危险!!!!它只是PC从000开始,内部寄存器并未回到复位值,所以程序初始化一定要彻底,一切系统资源都要初始化,哪怕未用!!!建议最好关狗,等RESET复位较安全(什么什么我用PC跳转没遇到问题啊?大哥你扎这幸运呢!^_^)
感谢21ic网友——zyboy投递。原帖地址:深入--单片机软复位(PC跳转)