1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

関数ポインタの使い方

Posted at

目的

関数ポインタの使い方を説明する。

内容

関数ポインタとは、関数をメモリに保存して呼び出すものである。

  • メリットは、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

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?