2013-03-26 187 views
4

我用下面簡單的代碼重新審視函數指針在C:使用傳遞函數指針作爲參數

Caller(TestFn, 7) //and 
Caller(&TestFn, 7) 

兩個

unsigned TestFn(unsigned arg) 
{ 
    return arg+7; 
} 

unsigned Caller(unsigned (*FuncPtr)(unsigned), unsigned arg) 
{ 
    return (*FuncPtr)(arg); 
} 

我把它叫做給出了相同的輸出結果:14有什麼解釋這個的。我之前一直在使用第二種調用方式。

+2

我相信地址是通過TestFn時隱式傳遞的,所以它的解釋實際上與&TestFn相同。 – Martinsos 2013-03-26 17:03:00

+2

我認爲這個問題可以回答它,即使它是C++ http://stackoverflow.com/questions/6893285/why-do-all-these-crazy-function-pointer-definitions-all-work-what-is-really- goi – Joe 2013-03-26 17:03:00

回答

6

函數在這裏工作類似於數組。假設你有:

char hello[5]; 

您可以參考這個變量的地址直接作爲hello - 變量名「衰變」成一個指針 - 或者&hello,其中明確取得地址。

功能是一樣的:如果你寫TestFn它衰變成一個函數指針。但是你也可以使用&TestFn。後一種形式可能會更好,因爲它對更多人來說很熟悉。

+1

Thnx,正如你在數組中hello和hello相同的情況下所說的那樣,我嘗試過使用func ptrs,並且看到它們是:&ptr,ptr,* ptr,** ptr,****。 * ptr都一樣。這與取消引用將賦予元素值的數組顯得有點不同。 – CuriousSid 2013-03-26 17:22:10

+0

是的,它有點不同:當你取消引用函數指針時,你得到一個函數,用它的地址表示。但地址也是指針的值。所以如果p是一個函數指針,p == * p == ** p == ... – Joni 2013-03-26 18:24:01

2

就像您傳遞字符串的地址而不使用&符號'&'符號一樣,您不需要使用&字符來表示您傳遞的是function pointer。您可以通過K & R搜索該書。它包含了一個很好的解釋