2013-05-18 48 views
0

有這樣的代碼:爲什麼表達式a()和(****&a)()調用相同的函數?

void a() { } 

int main(){ 
    a(); 
    (****&a)(); 
    return 0; 
} 

它是如何發生的聲明(****&a)();具有作爲a();同樣的效果?

+1

'(********************************************* ************* &a)();'也是。 – deepmax

+0

哦,夥計們,真的嗎?[12分鐘的價值區別?](http://stackoverflow.com/questions/16625902/function-variable-代替-的指針到功能) – 2013-05-18 15:46:19

回答

7

這一切都由於功能到指針轉換(§4.3):「指針T

功能類型T的左值可以被轉換成類型的prvalue結果是一個指向函數的指針。

&a首先給你一個指向a的指針。然後你用*將它解引用給你自己的函數。然後嘗試解除引用該函數,但由於不能,它會進行函數到指針的轉換以再次獲取指針。您將該指針與*取消引用,依此類推。

最後(****&a)表示函數a,您可以調用它,因爲您可以將()應用於函數而不進行函數到指針的轉換。

相關問題