2014年7月20日 星期日

C語言的函數指標(function pointer)的參數特性

  今天在解一個bug時在看相關的code,發現有個跟函數指標有關的地方我以為是一種bug,在與主管釐清了一些觀念後,把自己了解的觀念給記下來。

  函數指標(function pointer):就是一個指向函數的指標,指標必須先決定接收的參數資料型態回傳值這兩種東西,舉例來說,假設想宣告一個函數指標為fptr,而fptr的參數資料型態為float,回傳值為void,則我們必須這樣宣告它。
void (*fptr)(float);
要將fptr指向某個函數,只要將函數名稱給值給fptr即可。函數名稱事實上就是個常數指標(constant pointer),所存的內容就是該函數在記憶體中占據的記憶體位址的開頭。fptr所指向的函數,照正常所學的C語言教學,fptr所指向的函數必須也是參數資料型態為float,回傳值為void,不過事實上函數指標並非那麼嚴謹。下面用一段code舉三種例子來說明。


Example 1: fptr指向func1參數資料型態為float,回傳值為void。則編譯後沒有warning或error,output為
In func1, get a float number = 1.000000.

Example 2: fptr指向func2參數資料型態為int,回傳值為void。則編譯後會有一個pointer類別的incompatible warning,不過會有正確output。output為
In func2, get an int number = 1.

Example 3: fptr指向func3參數資料型態為float,回傳值為int。則編譯後會有一個pointer類別的incompatible warning,不過會有正確output。output為
In func3, get a float number = 1.000000.

  這邊得到的結論是,就算函數指標與指向的函數是不同類型,依舊可以得到正常的結果,最多只會出現warning。在科技業界裡編譯source codes的時候,如果warning並不會導致任何bug,通常都會直接偷渡過去,這就是編譯codes時有warning也不去理會的原因。現在出社會後,才能深深體會到。

沒有留言:

張貼留言