0

C99 6.3.2.1 / 4

関数指定子は、関数型を持つ式です。sizeof演算子または単項&演算子のオペランドである場合を除き、 「関数戻り型」型の関数指定子は、「関数戻り型へのポインタ」型の式に変換されます。

sizeof私が理解しているように、これは、演算子と単項演算&子が関数に適用される場合を除いて、それを示唆しています。関数からポインタへの変換は行われません。しかし、私が見たものから、

int (*p)(int) = &foo;

また、

int (*p)(int) = foo;

どちらも機能しているようです。これは、との両方が同等であることを示してい&fooますfoo。では、上記のように単項演算子が効果を発揮する場合、どこで&効果がありますか?

4

2 に答える 2

3

あなたはどういうわけかそれを逆に理解しました。逆に、関数識別子がまたはで使用されていない限り、関数型は自動的に関数ポインタ型に減衰します。sizeof&

繰り返しますが、undersizeof関数&型はポインタに減衰しません。他のすべての場合、それはポインタ型に減衰します。sizeof(これは、関数への適用が違法であるという事実につながります。)

Cでの関数型の動作は、配列型のよく知られた動作を反映しています。sizeofまたは&で使用しない限り、関数型は即座に暗黙的にポインタ型に変換されます。

これは、例では式&foofoo同等であることを意味します。最初のケースでは、ポインタは。の明示的なアプリケーションによって生成されます&。2番目のケースでは、ポインターは暗黙の「関数型減衰」機能によって生成されます。ポインタ値はどちらの場合も同じです。

于 2012-12-01T23:56:57.847 に答える
1

int (*p)(int) = foo;

関数ポインタへの自動変換が行われるため、次のようになります。

int (*p)(int) = &foo;

関数ポインタへの変換は自動ではなく、&オペレータによって実行されます。

通常変換される暗黙のポインタにfooは、取得できるアドレスがありません。そして、そのアドレスが取得可能である場合、それはのアドレスではありませんfoo

于 2012-12-01T23:53:59.857 に答える