配列とポインタについて
関数へのポインタ
プログラムはメモリ上に展開されるということで、変数以外にも関数もアドレスを持っています。関数を定義した時点でアドレスが割り当てられ、そのアドレスが指す関数を呼び出すということができます。
関数の一覧をあらかじめ定義しておくことにより、呼び出し先の複数の関数の呼び出しを振り分けることができます。
typedef void (*CALL_FUNC)(void);
これを関数外で定義しておくことにより、「CALL_FUNC」は関数のポインタを示す型であることが定義されます。
CALL_FUNC f[] = {subfunc0, subfunc1};
これで、関数のポインタを示す型である「f」が宣言され、初期値として、関数「subfunc0」「subfunc1」が設定されました。このあとにプログラム上で「(*f[0])();」とすれば関数subfunc0が呼び出され、「(*f[1])();」とすれば関数subfunc1が呼び出されるのです。
この説明では利便性が伝わらないと思いますが、呼び出す際の要素を変数で指定し、繰り返しや状況において変更できる工夫をすることによって、何分岐にも渡るif文やswitch文を明記することがなく処理の振り分けを制御することができます。
また、振り分けを行なう関数とは別に、ヘッダファイルに関数名や関数へのポインタを宣言することにより、機能追加などがあった場合にも、ソースファイルを修正する必要がないため、修正ミスが起こりにくくなります。
アドレス参照の関数の呼び出しであっても、引数は設定することができますので、実行結果を返却して後処理を記述することも出来ます。しかし、よほど振り分け先が多いなどでない限り、この方法を使うことはないと思います。