• 首页
  • 中国
  • (*(void(*)())0) ()讲解-单片机另类的复位

(*(void(*)())0) ()讲解-单片机另类的复位

2023-11-01 136浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。
硬件地址跳到0处

(*(void(*)())0)();

预备知识

float (*h)();

表示h是一个指向返回值float类型的函数的指针

(float(*)())

表示一个"指向返回值float类型的函数的指针"的类型转换符

假设fp是一个函数指针,那么如何调用fp所指向的函数,调用方法如下:

(*fp)();

按照人们的惯性思维,那么我们可以这样写

(*0)();

上式不能生效,因为运算符*必须要一个指针来做操作数,而且这个指针还必须是个函数指针。所以我们必须要把0强制转换成一个函数指针(指向返回值为void类型的函数的指针)

假设fp是个float指针,声明如下

float * fp;

把0强制转换成一个float指针(把变量fp去掉就可以了)

(float *)0;

类似:

假设fp是函数指针为void类型的函数的指针),声明如下:

void (*fp)();

把0强制转换成该函数指针(变量fp去掉就可以了)

(void(*)())0

*后用(void(*)())0代替fp,从而得到调用的用法

(*(void(*)())0)();

可用typedef简化函数指针

例如:

typedef char * string;

string test="hello";

类似

typedef void(*func)(); //这样func就表示一个函数指针的类型

(*(func)0)();

例子

方法一:

typedef void (*pfunction)(void);

void FMI_Jump(void){ pfunction jump; jump=(pfunction)(0x80000); jump();}

方法二:

((void(code *)(void))0xF400)();


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台