関数へのポインタ
ポインタといえば変数に「*」があります。その他に、関数にもポインタが存在します。
関数が保存されているメモリ上の場所は移動しません。
そのため配列変数名と同じように関数名は定数として扱われています。
また、関数名はグローバル変数と同じくファイルスコープを持ちます。このことよりプロトタイプ宣言、もしくは、関数定義位置以降で参照することが可能となります。
※関数呼び出しが可能な位置と同じとなります。
それではサンプルを見てください。
このサンプルでは次の4種類について見てみます。
NO | 内容 | 1 | voidを使用したケース | 2 | 戻り値を使用したケース | 3 | typedefを使用したケース | 4 | 配列ポインタとしたケース |
それではvoidを使用したケースについて見てみます。
void (*ポインタとして使用する関数名) ( 引数1, 引数2, ... , 引数n );
|
26行目を見てください。
型宣言の箇所が「void」となっています。
今回は引数としてint型を2つ利用した関数を対象とすることができるという宣言です。
ここ(26行目)で定義した「fp」に「calcPlus」関数を設定しています。
これで関数のポインタの準備ができました。
実際に利用しているのが29行目です。
引数のところに「(a, b)」としていることにお気づきのことと思います。
このように引数に変数a、bを設定してその結果を表示しています。
ここで使用している「calcPlus」関数は73~77行目に記載されています。
次に戻り値がある関数をポインタを使った例を見てみます。
とはいっても、先ほどとほとんど同じです。
voidが変数の宣言型である「int」となっているところが変わっているところです。
ちょっと書き方が違うだけですね。
あとは同じように引数に変数を渡したりしています。戻り値があるので40行目のようにresult変数に値が返ってきます。
次に「typedef」を使用した例を見てみます。
「typedef」は3行目に定義してます。
この宣言を使って「=&」として関数のアドレスを渡しています。
ここで使用しているのは「calcPlus」および「calcMinus」でいずれも
void型
引数が同じ
で形式が同じことがポイントです。
この「共通」の形式を「typedef」で表しています。
そして宣言すると51行目や54行目のように使用することができます。
さいごにポインタ配列を使用した例です。
これも3行目で定義した「typedef」の形式を使っています。
お気づきのことと思われますが、四則演算形式のものを73~95行目のように用意しています。
この同じ形式の関数をポインタ配列に格納してしまいます。
今回は上記の例のようにアドレス演算子を使って入れるのではなく、配列にそのまま関数名を格納しています。
あとは結果を表示しているのが66~69行目の通りとなります。
サンプルプログラムを実行した結果です。
|
|