|
|
1行目: |
1行目: |
− | '''関数ポインター'''とは、[[関数]]の[[ポインター]]である。
| + | ;LUT |
− | | + | * [[ルックアップテーブル]] (Look-up Table) |
− | == 英語読みについて ==
| + | {{aimai}} |
− | 日本語でいう「[[関数]]」は[[プログラミング言語]]によって「ファンクション(function)」だったり「メソッド(method)」だったりと曖昧なので、英語での呼び方も「function pointers」だったり「method pointers」だったり「functors」だったりと様々である。よって名称・呼称の細かい違いは気にしてはならない。時間の無駄である。
| |
− | | |
− | == 概要 ==
| |
− | 関数ポインタは[[関数]]を[[変数]]のように扱えてうれしいという物である。
| |
− | | |
− | 主に絶望的なほど巨大な分岐処理を、関数ポインタの[[LUT]]に置き換えてることで[[ソースコード]]を単純化するなどという場面で使われる。[[ゲーム]]などではよく多用される技法である。
| |
− | | |
− | また、[[コールバック関数]]と呼ばれる使われ方もある。たとえば[[Windows]]などのいわゆる[[イベントドリブン]]な[[実装]]では、何かしらの[[イベント]]発生時に関数ポインタ変数が[[NULL]]ではなかったら[[関数]]([[コールバック関数]])を実行する、などという使われ方をしている。
| |
− | | |
− | == 記述例 ==
| |
− | === C言語 ===
| |
− | [[C言語]]系の[[プログラミング言語]]では[[実引数]]の[[型]]が一致していなくても怒られないことが多い。そのため、その扱いには注意を要し、一歩間違えれば[[バグ]]の温床となる。
| |
− | <source lang="c">
| |
− | #include <stdio.h>
| |
− | | |
− | static int func(int a)
| |
− | {
| |
− | printf("func: %d\n", a);
| |
− | return 2 * a + 3;
| |
− | }
| |
− | | |
− | int main(void)
| |
− | {
| |
− | int (*f1)(int a) = func;
| |
− | int result = (*f1)(10);
| |
− | | |
− | printf("main: %d\n", result);
| |
− | return 0;
| |
− | }
| |
− | </source>
| |
− | | |
− | === Pascal ===
| |
− | 元祖[[Pascal]]にはそもそも[[ポインタ]]自体がない。よって関数ポインタもない。
| |
− | | |
− | === Turbo Pascal ===
| |
− | [[Turbo Pascal]]にはPointer型という名の[[ポインタ]]が追加されている。
| |
− | <source lang="delphi">
| |
− | program Test;
| |
− | | |
− | uses
| |
− | Classes;
| |
− | | |
− | type
| |
− | TFuncPointer = function(a : Integer):Integer;
| |
− | | |
− | function Func(a : Integer):Integer;
| |
− | begin
| |
− | WriteLn('Func: ', a);
| |
− | Func := 2 * a + 3;
| |
− | end;
| |
− | | |
− | var
| |
− | ptr : Pointer;
| |
− | ret : Integer;
| |
− | begin
| |
− | ptr := @Func;
| |
− | ret := TFuncPointer(ptr)(10);
| |
− | WriteLn('Main: ', ret);
| |
− | end.
| |
− | </source>
| |
− | | |
− | === C# ===
| |
− | [[C Sharp|C#]]は見た目こそ[[C言語]]似だが、その実態は[[Turbo Pascal]]の方言であるため、基本は[[Turbo Pascal]]に右に倣えである。
| |
− | | |
− | [[C Sharp|C#]]では関数ポインタは[[オブジェクト指向プログラミング言語]]として、同一[[インスタンス]]内の[[フィールド変数]]や[[プロパティ]]を[[参照]]できるなど、若干の改良が加えられており、その名称も「[[デリゲート]]」と改名されている。名称と微妙な機能の差はあるが基本は同じである。
| |
− | <source lang="csharp">
| |
− | using System;
| |
− | | |
− | class App
| |
− | {
| |
− | delegate int FuncDelegate(int a);
| |
− | | |
− | static int Func(int a)
| |
− | {
| |
− | Console.WriteLine("func: {0}", a);
| |
− | return 2 * a + 3;
| |
− | }
| |
− | | |
− | static void Main()
| |
− | {
| |
− | var f1 = new FuncDelegate(Func);
| |
− | int result = f1(10);
| |
− | | |
− | Console.WriteLine("main: {0}", result);
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | == 関連項目 ==
| |
− | * [[第一級関数]]
| |
− | * [[高階関数]]
| |
− | * [[クロージャー]]
| |
− | * [[ラムダ式]]
| |
− | | |
− | == 参考文献 ==
| |
− | {{reflist}} | |
− | | |
| {{stub}} | | {{stub}} |