一小段精彩的 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,这下就清楚了吧,我们将上面转化好的函数指针进行引用(也就是调用函数指针指向的函数)。