2011-09-22 21 views
14

可能重複:
How does dereferencing of a function pointer happen?函數指針 - 自動提領

void myprint(char* x) { 
     printf("%s\n", x); 
    } 

    int main() { 
    char* s = "hello"; 
    void (*test)(char*); 
    void (*test2)(char*); 

    test = myprint; 
    test2 = &myprint; 

    test(s); 
    (*test)(s); 
    test2(s); 
    (*test2)(s); 

    } 

誰能向我解釋爲什麼所有上面的代碼是有效的? 「你好」打印四次。通過應用函數指針,它是否被隱式地拒絕了?基本上我想知道函數指針是如何實際存儲的,因爲上面有點混淆。

+0

'(****** test)(s)'也是有效的:-) – sidyll

+1

請參見前面的問題:http://stackoverflow.com/questions/2795575/how-does-dereferencing-of-a函數指針發生 –

+1

函數和函數指針是特殊的,它們的處理與任何其他類型的指針都不一致。請參閱[如何解除函數指針的解除引用?](http://stackoverflow.com/q/2795575/2509)以及側邊欄中的其他問題。 – dmckee

回答

26

這只是C的怪癖。沒有其他原因,但C標準只是說,取消引用或獲取函數的地址只是評估指向該函數的指針,並且取消引用函數指針只是返回到函數指針。

這種行爲(因此明顯)與一元運算符&*對普通變量的工作方式有很大不同。

所以,

test2 = myprint; 
test2 = &myprint; 
test2 = *myprint; 
test2 = **********myprint; 

一切只是做同樣的,給你一個函數指針myprint

同樣,

test2(s); 
(*test2)(s); 
(***********test2)(s); 

做同樣的,調用存儲的函數指針test2。因爲C說它有。