static int* p= (int*)(&foo);
我只知道p指向代碼段中的內存。 但我不知道這一行究竟發生了什麼。
我想也許這是一個指向函數的指針,而是指向函數的格式是:這條線在C99中意味着什麼?
returnType (*pointerName) (params,...);
pointerName = &someFunc; // or pointerName=someFunc;
static int* p= (int*)(&foo);
我只知道p指向代碼段中的內存。 但我不知道這一行究竟發生了什麼。
我想也許這是一個指向函數的指針,而是指向函數的格式是:這條線在C99中意味着什麼?
returnType (*pointerName) (params,...);
pointerName = &someFunc; // or pointerName=someFunc;
你拿的foo
地址,並投它的指針的int
。
如果foo
和p
是不同的類型,編譯器可能會發出關於類型不匹配的警告。演員將抑制該警告。
例如,考慮下面的代碼,這導致警告從所述編譯器(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
。
指向一個對象(即不是void *而不是指向函數的指針)的指針不能被存儲到指針,而不指向任何其他類型的對象,除非在少數情況下除限定符外,其他類型相同 。如果該規則被破壞,則符合編譯器需要發出 診斷。
除此之外,該標準允許編譯器來解釋蒙上 三分球很無厘頭的時裝代碼,除非代碼助手通過一些限制 其中,作爲書面做出這樣的類型轉換基本上是無用的,促進優化的名義 目的。在編寫規則時,大多數 編譯器可能會執行大約一半的優化,根據規則允許執行 ,但仍然會理性地處理指針轉換 ,因爲這樣做可能會花費理論上可能的優化的5%。然而,今天,編譯器編寫者 尋求所有優化將被標準允許而不考慮它們是否有意義的所有情況。
編譯器GCC一樣有一個選項-fno嚴格走樣,阻止這種 這種優化,無論在哪裏會產生很大的效益和 風險不大,以及在情況下,它幾乎肯定會破了例代碼並且不可能提供任何真正的好處。如果他們 有一個選項可以阻止只有後者,但我不知道其中一個,這將會很有幫助。因此,我的 建議是,除非有人想在Dennis Ritchie的語言的非常有限的子集 中編程,否則我會建議針對-fno-strict-aliasing 方言。
通過函數的類型你是指返回的變量的類型? – TheLogicGuy
那裏沒有功能!我擴大了我的答案,所以現在可能會更清楚。 – lukeg
但考慮'foo'是一個函數而不是變量。現在怎麼可能? – TheLogicGuy