6

次の簡単なコードを使用して、Cの関数ポインターを再検討していました。

unsigned TestFn(unsigned arg)
{   
    return arg+7;
}

unsigned Caller(unsigned (*FuncPtr)(unsigned), unsigned arg)
{
    return (*FuncPtr)(arg);
}

使って呼んだ

Caller(TestFn, 7)  //and
Caller(&TestFn, 7)

両方とも同じ出力を出しました:14。これの説明は何ですか。私は以前に2番目の呼び出し方法を使用していました。

4

2 に答える 2

8

ここでは、関数は配列のように機能します。あなたが持っているとしましょう:

char hello[5];

この変数のアドレスを直接参照することができますhello-変数名はポインタに「減衰」します-または&hello明示的にアドレスを取得するとして。

関数は同じです:あなたがそれを書くならば、TestFnそれは関数ポインタに崩壊します。ただし、を使用することもできます&TestFn。後者の形式は、より多くの人に馴染みがあるため、より良いかもしれません。

于 2013-03-26T17:08:20.520 に答える
2

アンパサンド記号を使用せずに文字列のアドレスを渡すのと同じように、アンパサンド'&'記号を使用してを渡す必要はありませんfunction pointer。K&Rで本を検索できます。それは良い説明が含まれています

于 2013-03-26T17:08:56.580 に答える