三田典玄の「体育館の裏話」
int (*f)(int x,int y);
この宣言で、「f」という名前のポインタ変数(関数へのポインタ変数型)が
定義される。x,yのある括弧内はパラメータの部分を指す。
そして、この関数へのポインタfが指し示す先の関数はx,yというint型の
2つの引数を持つ。
次に、このfに、先ほど定義したfunction()関数の関数へのポインタを代入
するには、以下のように書く。
f = function;
で、この「f」のポインタ変数にある関数を呼び出すには、以下の書式を使う。
a = (*f)(x,y);
で、なんでこんなまどろっこしい方法で関数をわざわざポインタ変数で
表現して使うのかというと、要するに変数として関数を扱える、というこ
とは、関数の引数として関数を渡す、ということができたり、関数の戻り
値として関数を返す(?)ことができたり、関数のポインタ変数の配列を作
ることによって、関数の配列を作ることができたり、要するに「関数」を
、「変数」のように扱うことができるからだ。
え?それって・・・と、思った方は鋭い。
まさに、プロシージャとデータが同列に扱える、という「オブジェクト指向」
そのもの、なんだな。そして、この関数が構造体に「ポインタ変数として」
登録できる、ということになるから、つまりはそれが「クラス」ということ
になる。
実は、C言語ってのは、その言語をよく知っている人にとっては、それができ
た最初から「オブジェクト指向」的プログラミングが可能になっていたのだ。
しかし、話は逆で、これまでC言語でオブジェクト指向的な書き方をしていた
プログラマがもっと簡単に「オブジェクト指向」を実現できるといいね、と、
C言語をなおしたものが、「C++」とか「Objective-C」なんかのオブジェクト
指向C言語なんだな。
ということで、「関数へのポインタ」ができる、ということは、単にそれだけ
にとどまらない、大きな可能性を持ったプログラミングへの入り口だったわけ
だ。
(続く)
この記事にはトラックバック・コメントがありません。
コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。