如何使用指向函数指针的指针(pointer-to-pointer to function)调用函数?
问题背景
首先是指针声明:
void (**Func1Ptr)() = {NULL};//pointer-to-pointer to function void (*Func2Ptr)() = {NULL};//pointer to function
定义两个函数:
void FuncA() { } void FuncB() { }
完成赋值操作:
- 将
Func2Ptr指向FuncA的地址:
Func2Ptr = FuncA;
- 将
Func1Ptr指向Func2Ptr(即指向指向FuncA的指针):
Func1Ptr = &Func2Ptr;
问题:如何通过Func1Ptr调用目标函数FuncA?
解决方案
可以通过以下几种合法方式调用目标函数:
- 显式两次解引用
这是最直观的写法,先解引用得到函数指针,再解引用得到目标函数:
(**Func1Ptr)();
- 省略一次解引用
C++语法允许调用函数指针时省略*操作符,所以可以直接对*Func1Ptr(即函数指针)进行调用:
(*Func1Ptr)();
- 省略所有解引用
更进一步,由于编译器会自动处理函数指针调用时的隐式解引用,甚至可以直接调用Func1Ptr:
Func1Ptr();
原理说明
Func1Ptr是指向函数指针的指针,*Func1Ptr会得到它指向的函数指针Func2Ptr,而**Func1Ptr就对应目标函数FuncA。C++为了简化函数指针的调用,允许在调用时省略任意数量的*,因此后两种写法都是合法的,最终都会编译为调用FuncA的指令。
内容的提问来源于stack exchange,提问作者Ig_M
相关产品推荐
相关产品推荐

