C 関数ポインタ 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(関数ポインタ)
(関数ポインタ)
23行: 23行:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
上記のような結果から_tmainという名前の関数もアドレスが保持されていて、アドレス演算子を付与しなくても、出力引数として関数名を与えると、ポインタ変数と同じようアドレスが出力され、ポインタと同様に扱えることがわかります。
 
上記のような結果から_tmainという名前の関数もアドレスが保持されていて、アドレス演算子を付与しなくても、出力引数として関数名を与えると、ポインタ変数と同じようアドレスが出力され、ポインタと同様に扱えることがわかります。
 +
 +
 +
となると、関数を扱うポインタ変数の作り方、定義する方法が必要になるわけで、以下のようにして関数を扱うポインタ(関数ポインタ)変数が宣言できます。
 +
 +
 +
'''戻り値の型名 (*関数ポインタ変数)(引数の型名)'''
 +
 +
 +
具体的には、以下のような記述になります。
 +
<syntaxhighlight lang="cpp" line start="1">
 +
void example_function1(int n,int m){
 +
    printf(”example_function1 %d %d”,n, m); 
 +
};
 +
int _tmain(int argc, _TCHAR* argv[])
 +
{
 +
  void (*pfuncExample1)(int,int);//定義
 +
  pfuncExample1 = example_function1;//代入
 +
 +
  (*pfuncExample1)(100, 200);//関数ポインタを使った関数の利用(呼び出し)
 +
  retrun 0;
 +
}
 +
</syntaxhighlight>
 +
上記のように、関数ポインタを利用して関数の定義、代入、呼び出しが出来ます。大事なのは戻り値の型と引数の型がすべて一致しないと代入のときに処理が失敗しますので、きちんと合わせるという事です。もうひとつ重要な事は、関数ポインタの宣言ときに変数の前に*を付けたり、利用するときにも、ポインタの中身を見るのと同様に変数の前に*をつける必要がありますが、関数ポインタ変数の場合はカッコ()を使って関数ポインタ変数全体を明示的に一つの意味をもったトークンであることがわかるように記述をしなければならないことです。
 +
 +
 +
メイン関数のようなスタートアップ関数は2回呼び出してはいけないことになっているので、最初の例で_tmain関数のアドレスを取得しましたが、調子に乗って関数ポインタを使って呼び出し処理をするようなことはしてはいけません。お忘れなく。たぶん、そんなことをしようと思う人はいないと思いますが…念のため。

2015年4月20日 (月) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス