2017-02-10 9 views
-2

は宣言有効である次の2つの関数呼び出しの次のどの機能呼び出しが有効ですか?

char first (int (*) (char, float)) ; 

int second(char, float); 

考えてみましょうか?

A)first (*second);

B)first (&second);

C)first (second);

D)上記

のいずれもがいずれかが私にこのコードを説明していただけますか?

+0

https://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work – Ryan

+10

他の宿題に関する質問は何ですか?その後、私たちはすべてパブに行く –

+3

あなたのコンパイラに質問しないでください – pm100

答えて

3

3つの呼び出しがすべて有効です。

C標準(6.3.2.1左辺値、アレイ、及び関数指定子)

4によれば、関数指定子は、関数型を持つ式です。 オペランドsizeofのオペランドである場合を除き)またはユニータ& 演算子の場合、関数戻り値の型が の型を持つ式に変換されます。

またあなたも、それはのオペランドとして使用されたときに式の中で使用した関数指定子は、暗黙のうち、実際には1例を除き、関数自体へのポインタに変換され

first(******second); 

を書くことができます&演算子で、関数のアドレスが明示的に指定されています。ここで

は実証プログラムは、その出力が

Hello! 

が機能first

char first (int (char, float)) ; 

のように持つ関数のパラメータを宣言することができることを考慮してくださいです

#include <stdio.h> 

void g(void (*f)(void)) 
{ 
    f(); 
} 


void f(void) 
{ 
    puts("Hello!"); 
} 

int main(void) 
{ 
    g(**********f); 

    return 0; 
} 

です関数型は関数へのポインタに暗黙的に調整されます。

+0

を 'f 'は'&f'を意味し、 'f'は'&f'を意味し、もちろん '&f'は'&f'を意味する。 – pm100

+0

@ pm100はい、あなたは正しい。 –

+0

Vladは、(標準)関数を使ったポインタの操作は無視されるという丁寧な言い方ですか? –

関連する問題