2011-09-22 19 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); 

    } 

上記のコードのすべてが有効である理由を誰も私に説明できますか? 「こんにちは」が4回印刷されます。関数ポインタを適用することによって、それは暗黙のうちにderefencedされますか?基本的に私は関数ポインタが実際にどのように格納されているのか知りたいのですが、上記は混乱するためです。

+0

'(******テスト)(S)' – sidyll

+1

は、この前の質問を参照してください:-)も有効です。http://stackoverflow.com/questions/2795575/how-does-dereferencing-of-a -function-pointer-happens –

+1

関数と関数ポインタは特別なものであり、他の種類のポインタとの統一的ではありません。 [関数ポインタの逆参照はどのように起こるのですか?](http://stackoverflow.com/q/2795575/2509)とその他の質問はサイドバーにあります。 – dmckee

答えて

26

これは他の理由はありませんが、C標準では、逆参照や関数のアドレスの取得はその関数へのポインタとして評価され、関数ポインタの逆参照はただの評価となります関数ポインタ。

この動作は、単一&*の演算子が通常の変数にどのように作用するかと(明らかに)大きく異なります。

ので、

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

すべてがちょうどまったく同じ操作を行い、あなたに同様myprint

への関数ポインタを与え、

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

はに保存されている同じ、呼び出す関数ポインタをいtest2。 Cはそう言いますから。

関連する問題