(*(void)(*)()0)();

在此,您已經看到了這篇文章,不妨停留幾分鐘,思考如上表達式的意義何在?

如果思考無果,請繼續看這篇文章,接下來你會獲得答案,你會發現原來也不過如此,就是紙老虎,一捅即破。

任何C變數的聲明都由兩部分組成:類型以及一組類似表達式的聲明符(declarator)。聲明符從表面上看與表達式有些類似,對它求值應該返回一個聲明中給定類型的結果。如:

int *g() , (*h)() ;

表達式*g()與(*h)()是整形表達式。

因為()運算符優先順序高於運算符*。*g()就等於*(g()):g是一個指針函數,是函數就有返回值,該函數的返回值類型為指向整形的指針。同理可以得出h是一個函數指針,h所指向的函數的返回值類型為整形。

如果概念模糊可參考:函數指針&&指針函數

如何來獲得聲明過後的類型呢,只需要把聲明中的變數名和聲明末尾的分號去掉,再將剩餘的部分用一個圓括弧來「封裝」起來即可。

void (*h)();

h的類型為:void(*)(),表示一個「指向返回值類型為void類型的函數的指針」,這個類型是否看著眼熟,就是(*(void)(*)()0)();表達式中的一部分。(void)(*)()0代表將0強制類型轉化成函數指針,暫且就用pF代替。

那麼原式就可以簡化為(*pF)();pF是一個函數指針,(*pF)就是該指針指向的函數名,函數名後面加一個括弧(),(*pF)()就代表執行這個函數。(*pF)()也可以簡寫為pF();

(*(void)(*)()0)();就代表去地址為0的位置執行程序。

接下來補充一個常式,對大家理解會有幫助,結果是在終端輸出兩個OK。

#include <stdio.h>
#include <stdlib.h>
typedef void(*pF)(void);

char fun(void)
{
printf("OK
");
}
int main(int argc ,char **argv)
{
pF Fun= fun; //定義函數指針Fun指向函數fun
(*Fun)(); //正式調用
Fun(); //簡寫調用
system("pause");
return 0;
}

如果你看懂了這篇文章,那你知道下面這句話中兩個void代表的意義嗎?思考無果的可以私信喲。

typedef void (*pF)(void);

微信公眾號:typedef,掃下方二維碼可關注博主。


推薦閱讀:
相关文章