関数ポインタとは

1428 ワード


プログラムに関数が定義されている場合、コンパイル時にシステムはこの関数コードに記憶空間を割り当てます.この記憶空間の最初のアドレスはこの関数のアドレスと呼ばれます.そして関数名はこのアドレスを表しています.アドレスである以上、ポインタ変数を定義して保存することができます.このポインタ変数を関数ポインタ変数と呼び、関数ポインタと略称します.では、このポインタ変数はどのように定義されますか?同じアドレスを指すが,関数を指すポインタ変数は,我々が先に述べた変数を指すポインタ変数の定義方式とは異なる.例:
 
  • int(*p)(int, int);

  • この文は、関数を指すポインタ変数pを定義します.まずポインタ変数なので「*」が必要です.すなわち(*p);次に前のintは、このポインタ変数が戻り値タイプがint型の関数を指すことができることを示し、後ろの括弧の中の2つのintは、このポインタ変数が2つのパラメータがあり、いずれもint型の関数を指すことができることを示している.したがって、この文の意味は、戻り値タイプがint型であることを指すポインタ変数pを意味し、2つの整数パラメータの関数があります.pのタイプはint(*)(int,int)である.したがって、関数ポインタの定義は次のとおりです.
    関数戻り値タイプ(*ポインタ変数名)(関数パラメータリスト);
    「関数戻り値タイプ」は、ポインタ変数が戻り値タイプの関数を指すことができることを示します.「関数パラメータリスト」は、ポインタ変数がどのパラメータリストを持つ関数を指すことができるかを示します.このパラメータリストには、関数のパラメータタイプを書くだけでいいです.ご覧のように関数ポインタの定義は、「関数宣言」の「関数名」を「(*ポインタ変数名)」に変更することです.ただし、ここで注意したいのは「(*ポインタ変数名)」です.両端のカッコは省略できません.カッコは演算子の優先度を変更します.カッコを省略すると、関数ポインタを定義するのではなく、戻り値タイプがポインタ型の関数を宣言する関数宣言になります.では、ポインタ変数が変数を指すポインタ変数なのか、それとも関数を指すポインタ変数なのか、どうやって判断しますか.まず変数名の前に「*」があるかどうかを見て、「*」がある場合はポインタ変数です.次に、変数名の後ろにパラメータタイプのカッコがあるかどうか、関数を指すポインタ変数、すなわち関数ポインタがある場合、変数を指すポインタ変数がない場合を見ます.最後に、関数を指すポインタ変数には++と--演算はありません.
    関数ポインタで関数を呼び出す方法
    例を挙げてみましょう
     
  • int Func(int x);/*関数を宣言*/
  • int (*p) (int x);/*関数ポインタを定義*/
  • p = Func;/*Func関数のヘッダアドレスをポインタ変数p*/
  • に割り当てる
    代入時の関数Funcには括弧もパラメータもありません.関数名Funcは関数のヘッダアドレスを表すため,付与後,ポインタ変数pは関数Func()コードのヘッダアドレスを指す.