サイトカレンダ

« 2007年 10月 »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

ログイン

ログイン

過去記事

金曜日10月12日


水曜日10月10日


火曜日10月 9日


土曜日10月 6日


木曜日10月 4日


月曜日10月 1日


日曜日9月30日


金曜日9月28日


 2007年10月21日(日) 21:53 JST

関数の話(7)

  • 2007年10月21日(日) 08:34 JST
  • 投稿者:
    Admin
今日の話題

ところで、ポインタ変数ってのは、変数へのポインタだけじゃなく、関数へのポインタも表現できる(やっと関数の話に戻ってきた)。

関数を定義するときは、通常は

int    function(int parameter1,int parameter2)
    {
    (関数の中身の記述)
    }


とするわけだが、このとき、function()という関数の定義とともに、functionという名前の変数も一緒に定義される。そして、そのfunctionという変数には、function関数へのポインタが入っている。

一方、関数へのポインタだけが入る変数である「関数へのポインタ型」の変数を定義することもできる。この場合は、このように定義する。

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言語なんだな。


ということで、「関数へのポインタ」ができる、ということは、単にそれだけ
にとどまらない、大きな可能性を持ったプログラミングへの入り口だったわけ
だ。

(続く)

トラックバック

このエントリのトラックバックURL:
http://report.mita.minato.tokyo.jp/trackback.php?id=20071019203458237
表示形式
コメント投稿

コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。