あなたを連れて剖析します(*(void)(*)()0)()

1380 ワード

(*(void)(*)()0)();
ここで、この文章を見ましたが、数分滞在して、上記のような表現の意味を考えてみてはいかがでしょうか.
もし思考が実を結ばないならば、引き続きこちらの文章を見てください、次にあなたは答えを得ることができて、あなたはもとはただこのようにすることに気づくことができて、紙のトラで、突き刺すとすぐ破れます.
任意のC変数の宣言は、タイプと同様の式のセットの宣言子(declarator)の2つの部分から構成されます.宣言子は表面的には式と似ていますが、評価には宣言の所定のタイプの結果を返す必要があります.次のようになります.
int   *g() , (*h)() ;
式*g()と(*h)()は整形式である.
演算子の優先度が演算子*より高いためです.*g()は*(g():gはポインタ関数であり、関数には戻り値があり、この関数の戻り値タイプは整形を指すポインタである.同様に、hは関数ポインタであり、hが指す関数の戻り値タイプは整形であることが分かる.
コンセプトブラーが参照できる場合:関数ポインタ&ポインタ関数
宣言後のタイプを取得するには、宣言の変数名と宣言の末尾のセミコロンを削除し、残りの部分をカッコで「カプセル化」するだけです.
void (*h)();
hのタイプは:void(*)()で、「戻り値タイプがvoidタイプの関数を指すポインタ」を表し、このタイプが見覚えがあるかどうかは(*(void)(*)0()である.式の一部.(void)(*)()0は、0強制タイプを関数ポインタに変換することを表し、しばらくpFで置き換えます.
原式は(*pF)();pFは関数ポインタであり、(*pF)はそのポインタが指す関数名であり、関数名の後ろに括弧()(*pF()を付け、この関数を実行することを表す.(*pF)()は、pF();
(*(void)(*)()0)();アドレスが0である位置を表すプログラムを実行します.
もう一つのルーチンを置いて理解してください.
#include 
#include 
typedef void(*pF)(void);

char fun(void)
{
	printf("OK\r
"); } int main(int argc ,char **argv) { pF Fun= fun; // Fun fun (*Fun)(); // Fun(); // system("pause"); return 0; }

実行結果は,端末が2つのOKを出力する.
 
もしあなたがこの文章を読んだら、次の2つのvoidが代表する意味を知っていますか?思考が実を結ばないのは私信だよ.
typedef void (*pF)(void);
译文链接:あなたを连れて剖析します(*(void)(*)()0)();