目的
関数ポインタの使い方を説明する。
内容
関数ポインタとは、関数をメモリに保存して呼び出すものである。
- メリットは、switchやifなど条件分岐を使用せずに、関数を間接的に呼べることである。
- デメリットは、プログラムの実行速度が遅い可能性があることである。
関数ポインタの宣言にtypedefが使用される。
// typedef (新しく設定した関数の型) の宣言
typedef 返り値 (*関数)(引数);
関数ポインタの例を以下に示す。
#include <stdio.h>
int add(int num1, int num2){
return num1 + num2;
}
int sub(int num1, int num2){
return num1 - num2;
}
typedef int (*fptrOperation)(int, int);
typedef int (*operation)(int, int);
operation operations[128] = {NULL};
void initializeOperationsArray(){
operations['+'] = add;
operations['-'] = sub;
}
int evaluateArray(char opecode, int num1, int num2){
fptrOperation operation;
operation = operations[opecode];
return operation(num1, num2);
}
int main(void){
initializeOperationsArray();
printf("%d\n", evaluateArray('+', 5, 6));
printf("%d\n", evaluateArray('-', 5, 6));
return 0;
}
プログラムの流れを説明する。
- プロトタイプ宣言
- fptrOperation関数ポインタ型の宣言(返り値:int, 引数:int, int)
- operation関数ポインタ型の宣言(返り値:int, 引数:int, int)
- operation関数ポインタ型の配列operationsの初期化
- メイン関数
- initializeOperationsArray関数の処理
- evaluateArray('+', 5, 6)の結果の出力→add関数の処理
- evaluateArray('ー', 5, 6)の結果の出力→sub関数の処理
- initializeOperationsArray関数
- operations配列のインデックスが’+’の場合は、配列にaddを代入
- operations配列のインデックスが’ー’の場合は、配列にsubを代入
- add関数(引数:num1, num2)
- 渡された2つの引数の足し算の結果を返す
- sub関数(引数:num1, num2)
- 渡された2つの引数の引き算の結果を返す
- evaluateArray関数(引数:opecode, num1, num2)
- fptrOperation関数ポインタ型のoperationを宣言
- oprationに、opecodeのインデックスをもつoperations配列を代入→operationにadd、subが代入される
- num1,num2を引数にもつoperation関数を返す→add(num1, num2)、sub(num1, num2)の処理
所感
関数ポインタ型のoperations配列に実行したい関数を入れておき、メイン関数で配列を指した関数ポインタを実行することで、
自由に関数を呼び出せる利点があると感じた。
参照
詳説Cポインタ P82, 83