2012-04-19 21 views
0

可能性の重複:
Why do all these crazy function pointer definitions all work? What is really going on?渡す関数ポインタ - セマンティクス

私は、等価性の両方を保持する理由コード

void f(int& i) 
{ 
    i++; 
} 

void g(void (passed_f)(int&),int& a) //`passed_f` equivalent to `*passed_f` 
{ 
    passed_f(a); 
} 

int main() 
{ 
    int n=0; 
    g(f,n);        //`f` is equivalent to `&f` 
} 

における説明のために感謝されますエラーが発生していないという意味で、同じ結果を返すのは、1です。 gに関数へのポインタや関数自体を受け入れるかどうかは関係ありません。私は[c]タグも適切であると推測します。

+2

参考文献はC、afaikには存在しません – BlackBear

+0

これは関数ポインタに関するCの文法的な特徴です。 'f'と'&f'の両方が同じです。 – chrisaycock

+0

答えはThxです。標準のどこかで公式化されていますか? –

答えて

2

関数ポインタはCで特別です:

  • 関数の名前、&fが関数ポインタである一方でfは、機能指名であると言います。間接関数ポインタは関数指定子に評価されます。間接指定関数指定子は、関数指定子自身を評価します。
  • あなたがほとんどすべての目的のためのポインタであるとして関数名を考えるならば、これはいくつかの理にかなって

など、あなたが(**f)()(*f)()f()として関数ポインタfを呼び出すことができるということになります。このバージョンのHello Worldをコンパイルしてみてください:

int main() 
{ 
    // try replacing * with & or adding more *s 
    (*printf)("Hello, world!\n"); 
    return 0; 
} 

C標準では、これは6.3.2.1項で説明しています。 C++標準については不明です。

+0

正確に。ありがとうございました! –

2

passed_fは実際に*passed_fに相当します。コンパイラは両方から同じ出力を作成します。違いはちょうど慣用的です。関数へのポインタがあることをより明確に表現し、この表記法は他の型に使用されるポインタ表記法と一貫しているため、後者の形式を好む人もいます。

関連する問題