您的位置:首页 > 其它

pc实现跳转。函数指针与绝对地址的跳转

2013-05-29 10:41 274 查看
一小段精彩的 C语言,1和2实现相同的功能,欢迎大伙跟帖呵(特别感谢trio老师)
1 void (*theUboot)(void);

。。。。

theUboot = (void (*)(void))(0x30700000);

theUboot();

。。。。。
2 (*(void (*)(void))(0x30700000))();
aokikyon 发表于 2008-9-10 21:00
看不懂。。。。。。。。ToT
讲解下好吗
shixq 发表于 2008-9-11 09:13
呵呵,强制类型转换,将一个绝对地址转换为一个函数指针,并调用这个函数以跳转到前面提到的绝对地址.

翻译成汇编就是:

mov r0,0x30700000;

mov pc,r0

trio老师说了,会用函数指针就可以成为C语言高手.

目前尚处于模仿阶段,还没有领会函数指针的精髓,继续修炼中...
shixq 发表于 2008-9-11 09:16
  原来用2的方式实现要加一个括号...

  看来对优先级的领会还是不够,当天少加了一个括号,编译死活通不过,没办法才用1的方法,先定义了一个空指针...
trio 发表于 2008-9-11 10:10
(*(void (*)(void))(0x30700000))();

可以这样理解
首先(void( * )(void) )是一个强制类型转换符,他将后面的0x30700000这个无符号整数强制转化为一个函数指针,该函数指针所指向的函数入口参数为 void,返回值也是void 。 如果到这步你看懂了,那么设(void (*)(void))(0x30700000)为 fp; 那么上面的表达式就可以简化为 (*fp)(); OK,这下就清楚了吧,我们将上面转化好的函数指针进行引用(也就是调用函数指针指向的函数)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: