2017-10-25 16 views
-1

は、このような宣言void *(*function)()は有効ですされていますか? 有効な場合、*functionは、呼び出された関数へのアドレスを返します。 そのアドレスには、どのような値が返されていますか? は、そのアドレスの保存値はあり、それがゼロの場合は0で、return 0および戻り値の型voidを持つ関数で何も返さないの違いは何ですか。関数へのポインタとその戻り値の型(ボイド)

+0

* "ですそのような宣言 'void *(* function)()'は有効ですか? " - コンパイラはあなたにこの質問に対する最良の答えを与えます。はい、有効です。 'function'は引数を取らずにvoidポインタを返す関数へのポインタです。 C宣言を読む方法の詳細については、[この回答](https://stackoverflow.com/a/30345939/4265352)を参照してください。 – axiac

+1

おそらく、より良いアプローチは、あなたがこれらの質問を持っているかどうかを説明することでしょう。孤立しているので、ほとんど何も意味しません。 –

答えて

1

次のように宣言が読まれる:

 function  -- function is a 
     *function  -- pointer to 
     (*function)() -- function taking unspecified parameters 
    *(*function)() -- returning pointer to 
void *(*function)(); -- void 

ので、functionです機能自体ではなく、関数型へのポインター。あなたは、それぞれがvoidへのポインタを返す、複数の機能を持つことができます:

void *foo(void) { ... } 
void *bar(void) { ... } 
void *bletch(void) { ... } 

あなたはそれらの機能のそれぞれを指し、そして呼び出すためにどの実行時に決定するfunctionポインタを使用することができます。

if (condition1) 
    function = foo; 
else if (condition2) 
    function = bar; 
else 
    function = bletch; 

void *ptr = function(); // or (*function)(); 
1

void * (*function)(); 

手段表記「引数の不特定多数を取る関数を指すfunctionという名前の関数ポインタを宣言し、次にvoid *返す。」

が、これは単に宣言以来それは関数を定義していないので、返される値については何も言えません。あなたはそれを呼び出す前にこのポインタを関数を指すように割り当てる必要があります。

あなたがfunctionを呼び出す場合、あなたはそれがアドレスが含まれていますが、間接参照することはできませんので、「純粋なメモリアドレス」として考えることができvoid *を、取り戻すだろう、何かを指すようにfunctionを割り当ててやるたらキャストのないオブジェクトに

void *を返すことは、戻り値の型がvoidの関数と同じではないことに注意してください。かつての手段は、「私は、メモリアドレスを返す」と後者の手段は、「私は全く何も返しません。」

関連する問題