Menu
Coddy logo textTech

関数ポインタの呼び出し

CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 34/61。

Now、function pointer を Declare して function を Assign する方法がわかったので、次のステップは、実際にその pointer を通じて function を呼び出すことです。

構文は簡単です。通常の関数を呼び出す場合と同じように function pointer を使います。

int add(int a, int b) {
    return a + b;
}

int main() {
    int (*operation)(int, int) = add;
    
    int result = operation(5, 3);  // add(5, 3) を呼び出す
    printf("%d\n", result);        // 出力: 8
    return 0;
}

pointer の名前の後に、引数を含む括弧を付けて記述するだけです。C は pointer を自動的にデリファレンスし、それが指す function を実行します。

(*operation)(5, 3) のような明示的な逆参照構文を使用することもできますが、これは任意であり、あまり一般的ではありません。どちらの形式でも同じ結果になります。

pointer を異なる functions に再代入すると、本当の力が現れます:

int subtract(int a, int b) {
    return a - b;
}

operation = subtract;
result = operation(5, 3);  // 今は subtract(5, 3) を呼び出します
printf("%d\n", result);    // 出力: 2

同じ変数 operation が、今ではまったく異なるロジックを実行します。実行時に動作を入れ替えられるこの機能が、Cにおけるポリモーフィズムの基盤です。

challenge icon

チャレンジ

簡単

ポインターを通じて function を呼び出し、実行される function を切り替える練習をしましょう。実行時に加算と減算を切り替えられる、シンプルな計算機を作成します。

次の処理を行うプログラムを作成してください。

  1. two つの function を定義します。
    • add: two つの int parameters を受け取り、それらの合計を返す
    • subtract: two つの int parameters を受け取り、first から second を引いた値を返す
  2. main 内で、calc と called された function pointer を Declare します。このポインターは、two つの int parameters を受け取り、int を returning する functions を指せます。
  3. four つの inputs(two つの整数と two つの operation コード)を読み取ります。
  4. 各 operation コードについて、次の処理を行います。
    • appropriate function を calc に Assign します(add は 1、subtract は 2)
    • two つの数値を使い、pointer を通じて function を Call します
    • result を print します

four つの inputs を受け取ります。first number、second number、first operation コード(1 または 2)、second operation コード(1 または 2)の順です。

Output には、別々の行に two つの results を表示します。同じ two つの数値を使って実行した各 operation の result です。

15
5

この例では、inputs が 10、5、1、2 です。first operation(コード 1)では 10 + 5 = 15 を計算し、その後 pointer を Reassign します。second operation(コード 2)では 10 - 5 = 5 を計算します。

これは、同じ pointer variable を、Call の間に Reassign することで、まったく異なるロジックを実行できることを示しています。

自分で試してみよう

#include <stdio.h>

// TODO: ここにadd関数を定義してください


// TODO: ここにsubtract関数を定義してください


int main() {
    // 入力を読み取る
    int num1, num2, op1, op2;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op1);
    scanf("%d", &op2);
    
    // TODO: 'calc'という名前の関数ポインタを宣言し、次を指せるようにする
    // 2つのintパラメータを取り、intを返す関数
    
    
    // TODO: 最初の操作コード (op1) について:
    // - 適切な関数をcalcに代入する (1はadd、2はsubtract)
    // - ポインタ経由で関数を呼び出し、結果を出力する
    
    
    // TODO: 2番目の操作コード (op2) について:
    // - calcを適切な関数に再代入する
    // - ポインタ経由で関数を呼び出し、結果を出力する
    
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ