C 関数ポインタ 新しいページはコチラ
提供: yonewiki
(ページの作成:「※このページではC言語にも存在していたという意味で記事タイトルがC 関数ポインタになっていますが、<br /> C++で...」) |
(→関数ポインタ) |
||
3行: | 3行: | ||
<br /> | <br /> | ||
== '''関数ポインタ''' == | == '''関数ポインタ''' == | ||
+ | 関数っていうのは、スタートアップ関数であるmain関数やWindowsであればwmain(_tmain)関数、あるいはwWinMain関数も含めて、すべて関数であると言えます。VisualStudioであればプロジェクトのプロパティでリンカのオプションとして指定する詳細設定の中のエントリポイントの設定によって最初に実行される関数を指定するようになっていて、最初に実行される関数を含めて、すべては関数やクラスの中の関数を呼び出すことによってプログラムが実行されます。Windowsのようなユーザインターフェースを持つプログラムの場合は大抵、割り込み処理を基にした概念が使われ、プログラムは動きっぱなしで、最初の起動時に呼ばれる関数さえ決まっていれば、一連の起動時にだけ実行する処理を実行し、何もしない待機状態になったり、特定の信号によってOSが割り込みを感知するとプログラムに割り込み処理が発生したことを通知し、通知されたイベントに対する関数が動作したりするような動作になります。あるいは特定の処理や特定の割り込み通知によって呼び出された関数によって、プログラムを終了することになります。このような関数と呼ばれているもの自体もメモリのどこかに配置されてプログラムは処理されることから、関数自体もアドレスを持ちます。呼び出し規約というものにしたがって、一定の法則に従って関数はメモリ上にスタックした関数パラメータを読み込んだり、ポップしたりしながら処理を進めます。関数とはそういうものだというイメージをもっていただければ、この項目は理解しやすくなると思います。具体的な個々の関数呼び出し規約の仕組みやスタートアップ関数の決定方法については別の記事で記述したいと思いますが、どこまでわかりやすく説明できるかは未知数です。関数は外部(OSあるいはタイプライブラリあるいは外部機器信号)から呼び出されたり、内部から呼び出されたり、内部から外部を呼び出したりするのが一般的です。そこにはセキュリティのような概念も登場します。 | ||
+ | |||
+ | |||
+ | まずは、関数ポインタによって関数にアドレスが付与される簡単な仕組みを確認してみましょう。以下のようなプログラムで関数はアドレスを保持していることが簡単に確認できます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include "stdafx.h" | ||
+ | |||
+ | int _tmain(int argc, _TCHAR* argv[]) | ||
+ | { | ||
+ | printf("%x",_tmain); | ||
+ | |||
+ | retrun 0; | ||
+ | } | ||
+ | </syntaxhighlight> |