関数ポインタ

変数がアドレスを持ち、変数のアドレスを格納する変数がポインタであるように、関数もアドレスを持ち、関数のアドレスを格納する変数を関数ポインタという・・・。

<戻り値型> (*<関数ポインタ名>)(<引数型>, <引数型>, ...);

関数ポインタはこんな風に宣言し、この引数型と戻り値型をもつ関数のアドレスを格納できる・・・。

funcは関数ポインタとその関数ポインタに渡す整数値xを引数としている・・・。

func1, func2は関数ポインタに格納し, 参照することで呼び出す関数・・・。
どちらも関数ポインタの定めた引数型と戻り値型になっている・・・。

funcでは渡されたfuncptrを参照した*funcptrに引数のxを渡して、結果をreturnしている・・・。

func1は"func1!"と出力し、渡されたiをそのまま返す・・・。
func2は"func2!"と出力し、-1に渡されたiを掛けた値を返す・・・。

入力されたxが0以上なら、func_ptrにfunc1を、0より小さいなら、func_ptrにfunc2をセット・・・。
そして、funcにfunc_ptrとxを渡す・・・。

$ vi function_pointer.c
$ gcc function_pointer.c -o function_pointer
$ ./function_pointer
x: 5
func1!
result = 5
$ ./function_pointer
x: -3
func2!
result = 3
$

xが5の場合は、func1が呼ばれ、そのまま5が返ってくる・・・。
xが-3の場合は、func2が呼ばれ、-1を掛けた3が返ってくる・・・。
つまり、これは入力された値の絶対値を求めるプログラムになっているのである・・・。
このように、関数ポインタで動的に動作を切り替えられる・・・。

Sample/function_pointer.c at master · bg1bgst333/Sample · GitHub