ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
以下はC/C++の関数ポインターについて記す。
変数と同様、関数にもアドレスが存在する。どちらも、同じメモリー上に存在するからである。
関数ポインターは、その関数の入口のアドレスを持つものである。
関数ポインターは通常の変数とは定義方法が異なる。変数とは違い、関数には引数と戻り値があるためで、この定義をする必要があるからである。
かくして、定義は通常の変数とは大きく趣が異なったものとなる。
型 (*変数名) (仮引数);
例えば、次のような関数があったとする。
int hoge(int fuga);
この関数へのポインターの定義と用法は、次のようになる。
int (*p)(int);
p = hoge;
p(123);
但しこのままだと、pが関数なのか関数ポインターなのか分からないため、多くのプログラマーはポインターからの間接参照であることを表わすために、敢えて次のように書いている。
(*p)(123);
正式な書式は後者で、前者の書き方は構文糖である。
関数をポインターで扱うことは、かなり斬新なことである。
もし関数が一つないし数個しかないのであれば、このような事をする意味はないが、多数ある場合は便利に用いることができる。
例えばシェルのような物を作りコマンド処理をするような場合を想定すると、コマンドごとに関数を用意してそのコマンド名と関数をテーブル化すれば、処理は大幅に簡略化できる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます