1. 程式人生 > >typedef void (*pFunction)(void);講解的特別好,適合新手學習

typedef void (*pFunction)(void);講解的特別好,適合新手學習

剛在網上看到的,講解的特別好,適合新手學習,高手請忽略...
轉自:http://blog.csdn.net/zyboy2000/article/details/4202349

(*(void(*)())0) ()  等同 ((void(*)())0) ()    ----原因函式是一種function-to-pointer的方式,&fun, fun, *fun ,**fun都是一樣

硬體地址跳到0處
(*(void(*)())0) ();

預備知識
float (*h)();
表示h是一個指向返回值float型別的函式的指標
(float(*)())
表示一個"指向返回值float型別的函式的指標"的型別轉換符


假設fp是一個函式指標,那麼如何呼叫fp所指向的函式,呼叫方法如下:

 (*fp)();

按照人們的慣性思維,那麼我們可以這樣寫
(*0)();

上式不能生效,因為運算子*必須要一個指標來做運算元,而且這個指標還必須是個函式指標。所以我們必須要把0強制轉換成一個函式指標(指向返回值為void型別的函式的指標)

假設fp是個float指標,宣告如下
float * fp;

把0強制轉換成一個float指標(把變數fp去掉就可以了)
(float *)0;

類似:
假設fp是函式指標為void型別的函式的指標),宣告如下:
void (*fp)();     

把0強制轉換成該函式指標(變數fp去掉就可以了)
(void(*)())0

最後用(void(*)())0代替fp,從而得到呼叫的用法
(*(void(*)())0) ();





可用typedef簡化函式指標
例如:
typedef char * string;

string test="hello";

類似
typedef void(*func)();   //這樣func就表示一個函式指標的型別

(*(func)0)();


例子
方法一:
typedef void (*pfunction)(void);

 void FMI_Jump(void)
{   
  pfunction jump;
  jump=(pfunction)(0x80000);
  jump();

}

 方法二:
((void(code *)(void))0xF400)();