将地址存储到函数指针中

问题描述 投票:0回答:2

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

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

“sysMemBootJump”是函数指针。

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

c pointers function-pointers
2个回答
3
投票

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


2
投票

这相当于:

u32 ad = *(u32*)0x1fff0004;

这是一个位于地址0x1fff0004的单词

然后

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

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

并注意代码是非常不可移植的。来自uintptr_t<stdint.h>是一种更便携的整体式可铸造地址。

您可以像typedef一样使用here函数签名来编写更易读的代码。

© www.soinside.com 2019 - 2024. All rights reserved.