将地址存储到函数指针中

时间:2017-12-19 05:56:43

标签: c pointers function-pointers

我正在观看this video关于使用软件调用引导加载程序,方法是将系统内存开头的地址分配给一个函数指针,然后调用它,用于存储地址的表达式:

sysMemBootJump = (void(*)(void))(*(u32*)0x1fff0004);

" sysMemBootJump"是函数指针。

但是我不明白的是,为什么在将内存地址转换为void(*)(void)之前他取消引用内存的地址?

2 个答案:

答案 0 :(得分:3)

因为'真实'入口点存储在该地址。可以把它想象成一个指向函数的指针,通过解除引用你只得到指向函数的指针。

答案 1 :(得分:2)

这相当于:

u32 ad = *(u32*)0x1fff0004;

这是提取位于地址0x1fff0004的单词

然后

sysMemBootJump = (void(*)(void))ad;

所以0x1fff0004是包含例程地址的单词的地址。

请注意,代码非常不可移植。来自<stdint.h> ....

的地址为uintptr_t的更便携的整体类型可投射到/来自地址

您可以typedef函数签名(如here)编写更易读的代码。