2

2つの質問があります

1.見ました

int (*Ptr)(int,int);
Ptr=someOtherFuncion;

そんなはずないでしょ?

Ptr=&someOtherFuncion;

2.その関数ポインタはそのようなコールバック用であることを学びます

    someOtherFunction(functionPointer)

ポインターではない通常の関数を配置する場合の違いは何ですか?

4

1 に答える 1

7

関数の名前は、ほとんどすぐに関数へのポインターに減衰するため、明示的に指定someOtherFunctionしたのと同じポインターに減衰します。&someOtherFunction実際、アドレス取得演算子 ( ) のオペランドは、減衰が起こらない&数少ない場所の 1 つです。

これには面白い結果があります。関数ポインターを逆参照しても、すぐに再び減衰します。したがって、以下はすべて同等です。

someOtherFunction(1, 2);
(*someOtherFunction)(1, 2);
(**someOtherFunction)(1, 2);
(***someOtherFunction)(1, 2);

そのため、明示的なアドレス指定なしで関数ポインターに代入するのが苦手な場合は、&必ずそこに入れますが、そうする必要はありません。

質問の 2 番目の部分に対処するには: 関数は常に関数ポインターを介して呼び出されますが、上記の瞬間的な減衰のために、通常の関数は関数ポインターとまったく同じ方法で呼び出すことができます。

于 2012-11-05T23:51:23.050 に答える