函數指針函數名轉換成內存地址調用
(*(void(*) ())0)();
這是《C Traps and Pitfalls》這本經典的書中的一個例子窿侈。
第一步:void(*) ()鱼的,可以明白這是一個函數指針類型糖埋。這個函數沒有參數腿宰,沒有返回值稠肘。
第二步:(void(*) ())0常潮,這是將0 強制轉換為函數指針類型斥黑,0 是一個地址揖盘,也就是說一個函數存在首地址為0 的一段區(qū)域內。
第三步:(*(void(*) ())0)锌奴,這是取0 地址開始的一段內存里面的內容兽狭,其內容就是保存在首地址為0 的一段區(qū)域內的函數。
第四步:(*(void(*) ())0)()鹿蜀,這是函數調用箕慧。
一個列子
#include <iostream>
using namespace std;
typedef struct {
void* method; //
} Method;
void test(){
cout<<"test function invoke"<<endl;
}
int main()
{
//結構體初始化
//把函數指針強制類型轉換成void指針(void*)
//然后賦值給method變量
Method m ={(void *)test};
//調用的時候,把void*類型的指針強制類型轉換成函數指針
//然后以函數指針調用函數的方式調用這個函數
//m.method 是函數的入口地址
(*((void(*) ())(m.method)))();
return 0;
}