函数指针访问指定内存地址
2026/8/19大约 1 分钟
函数指针访问指定内存地址
有时候我们知道一段函数代码位于某个固定地址,例如:
0x08000100如果想通过这个地址执行函数,就需要把这个地址转换成函数指针。
一、最朴素的写法
假设这个函数:
- 没有参数
- 没有返回值
对应的函数指针类型就是:
void (*)(void)因此可以直接写:
void (*p)(void);
p = (void (*)(void))0x08000100;
p();执行过程:
0x08000100
↓
强制转换成函数指针
↓
p
↓
p()
↓
跳转到 0x08000100 执行也可以一步完成:
((void (*)(void))0x08000100)();二、使用 typedef 简化
如果函数指针类型比较复杂,可以使用 typedef。
typedef void (*FuncPtr)(void);这样:
FuncPtr p;就等价于:
void (*p)(void);然后:
p = (FuncPtr)0x08000100;
p();这样代码更容易阅读。
完整写法:
typedef void (*FuncPtr)(void);
FuncPtr p;
p = (FuncPtr)0x08000100;
p();三、有参数和返回值时
例如目标函数是:
int func(int x);那么函数指针类型:
int (*p)(int);使用 typedef:
typedef int (*FuncPtr)(int);
FuncPtr p;
p = (FuncPtr)0x08000100;
int ret = p(10);这里:
地址
↓
函数指针
↓
调用
↓
得到返回值四、最终记忆
普通写法:
void (*p)(void);
p = (void (*)(void))0x08000100;
p();typedef 写法:
typedef void (*FuncPtr)(void);
FuncPtr p;
p = (FuncPtr)0x08000100;
p();核心就是:
把一个固定地址转换成与目标函数原型匹配的函数指针,再通过函数指针调用。

