函數指針函數名轉換成內存地址調用
(*(void(*) ())0)();
這是《C Traps and Pitfalls》這本經典的書中的一個例子。
第一步:void(*) (),可以明白這是一個函數指針類型。這個函數沒有參數,沒有返回值。
第二步:(void(*) ())0,這是將0 強制轉換為函數指針類型,0 是一個地址,也就是說一個函數存在首地址為0 的一段區域內。
第三步:(*(void(*) ())0),這是取0 地址開始的一段內存里面的內容,其內容就是保存在首地址為0 的一段區域內的函數。
第四步:(*(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;
}