帶你剖析(*(void)(*)()0)();

(*(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的位置執行程序。

再放一份例程幫助大家理解。

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

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

執行結果是終端輸出兩個OK。

 

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

typedef void (*pF)(void);

原文鏈接:帶你剖析(*(void)(*)()0)();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章