我看《C程序設計語言》書,看到103頁時,有一個關於指向函數的指針把我看糊塗了。如圖所示,函數指針就是裡面那個comp。可我找了半天也找不到它在哪裡定義的,那麼當調用它時它是怎麼轉換的呢?比如那個?:返回的是numcmp,那麼最後是怎麼轉到numcmp函數裡面呢?
題主弄混了一個關鍵的概念:指向函數指針的本質是什麼,在這裡也就是您所說的comp。
請注意,這裡的comp其實是一個變量,一個指針變量。而不是樓主所認為的函數!它不需要包含任何代碼,因為它是一個指針變量。當這個comp被賦值以後【一般都是賦一個函數代碼段地址值】,那麼運行時,有關comp的代碼語句都會直接把comp換成這個地址值,比如您截圖中的numcmp,當把它賦值給comp以後,以後再遇到comp時,就會直接調用numcmp,而不是從comp“函數裡”轉到numcmp。
請題主看下面的圖片代碼:
相信您會看明白,這裡的ptr【comp的兄弟,另一個函數指針】,其實是完全被當成一個指針變量賦值的。
當然,也可以在聲明時就給ptr初始化,不過格式要寫成這樣:【int (*ptr)(int a, int b) = fun;】,至於ptr的後面為什麼要跟一對參數列表,只是為了在編譯時檢查錯誤,看看被指向的函數是不是跟指向函數指針聲明時相匹配。它雖然有參數表,但僅僅是貌似函數而已,記住,披著羊皮的狼,是狼,不是羊!