8

次の C のコードが何をするのか理解しようとしています。

((void(*)())buf)();

ここで、「buf」はchar配列です。

4

10 に答える 10

21

一歩ずつ進んでいきましょう。

void(*)()

これは、指定されていない引数を取り、戻り値を持たない関数へのポインターです。

(void(*)())buf

buf をこの関数ポインタ型にキャストするだけです。ついに、

((void(*)())buf)();

この関数を呼び出します。

したがって、ステートメント全体は「引数のない関数bufへのポインターとして解釈し、voidその関数を呼び出す」です。

于 2009-11-11T14:37:33.570 に答える
9

bufタイプの関数ポインターvoid(*)()(何も返さない/void を返し、未指定の引数を取る関数)にキャストして呼び出します。

ANSI 標準では、通常のデータ ポインターを関数ポインターにキャストすることは実際には許可されていませんが、プラットフォームでは許可されている場合があります。

于 2009-11-11T14:36:26.163 に答える
5

気が遠くなるような宣言に出くわしたときは、「cdecl」コマンドを使用する傾向があります。例:

[me@machine]$ cdecl
Type `help' or `?' for help
cdecl> explain (void(*)())buf
cast buf into pointer to function returning void

「cdecl」の出力を説明するツールがあればいいのにと思う場合もありますが:/

于 2009-11-11T14:57:34.810 に答える
4

これは、未指定のパラメーターを取り、何も返さない関数へのポインターでbufある typeにキャストします。void (*)()次に、そのアドレス (右端の 2 つの括弧) で関数を呼び出します。

于 2009-11-11T14:37:02.200 に答える
2

buf指定されていない引数を取り、それを呼び出す関数ポインターにキャストします。

于 2009-11-11T14:36:39.237 に答える
2
((void(*)())buf)();
 \------------/ `buf` をキャスト
 \---------/ type: 固定値を受け入れる関数へのポインター。
                              不特定数の引数と
                              void を返す
\----------------/ そしてその「関数」を呼び出します
于 2009-11-11T14:41:14.967 に答える
1

「専門家の c プログラミング」は読みやすいかもしれません. 読んでからずいぶん経ちましたが、当時は苦労した甲斐があったと思いました。 http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

于 2009-11-11T14:53:12.853 に答える
1

lsc が言及した「cdecl」ツールのオンライン バージョンがあり、役に立つかもしれません: http://www.cdecl.org/

于 2009-11-13T10:45:21.920 に答える
1

多くの状況で、マシンがクラッシュすると思います。それ以外の場合、配列は void を返し、それを呼び出す関数へのポインターとして扱われます。

于 2009-11-11T14:36:38.300 に答える
0

関数ポインタを呼び出します。関数には引数がありません。

関数ポインタ - ウィキペディア

于 2009-11-11T14:37:07.997 に答える