在 C 中解引用函數指標的行為可能會產生意想不到的結果。例如,下面的程式碼片段似乎對函數指標執行了過多的取消引用,但輸出保持不變:
#include<stdio.h> void hello() { printf("hello"); } int main(void) { (*****hello)(); }
要理解這種行為,需要對於澄清C 中函數指標的語意至關重要。雖然函數名稱可能暗示函數的指針,但它們實際上表示函數程式碼的位址。因此,取消引用函數指標不會直接執行該函數,而是傳回函數指示符,該指示符會迅速轉換回函數指標。
在範例程式碼中,重複取消引用 hello 不會執行函數重複多次。相反,每次取消引用都會建立一個新的函數指示符,然後將其轉換回函數指標。最終的表達式 (*****hello) 只是計算為 hello 的函數指針,並透過 () 呼叫它會如預期地執行該函數。
另一個奇特的地方C 中函數指標的一個面向是它們在特定上下文中函數值和指標之間的隱式轉換。當函數值出現在右值上下文(用作值而不是位置的任何上下文)時,它會自動轉換為函數指標。此行為擴展到巢狀函數值,其中每個取消引用都會傳回一個指向原始函數的函數指標。
雖然函數指標取消引用的行為最初看起來令人費解,但它可能是在某些場景下是有益的。透過避免在傳遞函數指標時明確使用 &,程式碼變得更加簡潔和可讀。此外,透過函數指標和函數名稱呼叫函數之間的對稱性允許兩種形式之間的無縫轉換。
以上是為什麼在 C 中重複引用函數指標不會導致多次函數呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!