2017-01-21 71 views
0
static int* p= (int*)(&foo); 

我只知道p指向代碼段中的內存。 但我不知道這一行究竟發生了什麼。
我想也許這是一個指向函數的指針,而是指向函數的格式是:這條線在C99中意味着什麼?

returnType (*pointerName) (params,...); 
pointerName = &someFunc; // or pointerName=someFunc; 

回答

1

你拿的foo地址,並投它的指針的int

如果foop是不同的類型,編譯器可能會發出關於類型不匹配的警告。演員將抑制該警告。

例如,考慮下面的代碼,這導致警告從所述編譯器(initialization from incompatible pointer type):

float foo = 42; 
int *p = &foo; 

foo這裏是float,而p指向一個int。顯然 - 不同的類型。

類型轉換使得編譯器將一個變量視爲不同的類型。通過在括號中添加新類型名稱來進行類型轉換。在這裏,我們將指向float像一個指針來處理,int和警告會有更多:

float foo = 5; 
int *p = (int*)(&foo); 

你可能已經省略一對括號,以及和它會意味着同樣的:

float foo = 5; 
int *p = (int*)&foo; 

如果foo是一個函數,問題是相同的。我們有一個指向賦值右側的函數的指針和一個指向左側的int的指針。將會添加一個強制轉換以使指向函數的指針被視爲地址int

+0

通過函數的類型你是指返回的變量的類型? – TheLogicGuy

+0

那裏沒有功能!我擴大了我的答案,所以現在可能會更清楚。 – lukeg

+0

但考慮'foo'是一個函數而不是變量。現在怎麼可能? – TheLogicGuy

0

指向一個對象(即不是void *而不是指向函數的指針)的指針不能被存儲到指針,而不指向任何其他類型的對象,除非在少數情況下除限定符外,其他類型相同 。如果該規則被破壞,則符合編譯器需要發出 診斷。

除此之外,該標準允許編譯器來解釋蒙上 三分球很無厘頭的時裝代碼,除非代碼助手通過一些限制 其中,作爲書面做出這樣的類型轉換基本上是無用的,促進優化的名義 目的。在編寫規則時,大多數 編譯器可能會執行大約一半的優化,根據規則允許執行 ,但仍然會理性地處理指針轉換 ,因爲這樣做可能會花費理論上可能的優化的5%。然而,今天,編譯器編寫者 尋求所有優化將被標準允許而不考慮它們是否有意義的所有情況。

編譯器GCC一樣有一個選項-fno嚴格走樣,阻止這種 這種優化,無論在哪裏會產生很大的效益和 風險不大,以及在情況下,它幾乎肯定會破了例代碼並且不可能提供任何真正的好處。如果他們 有一個選項可以阻止只有後者,但我不知道其中一個,這將會很有幫助。因此,我的 建議是,除非有人想在Dennis Ritchie的語言的非常有限的子集 中編程,否則我會建議針對-fno-strict-aliasing 方言。