Menu
Coddy logo textTech

関数ポインタの呼び出し

CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 34/61。

関数ポインタを宣言し、それに関数を割り当てる方法を理解したところで、次のステップは、実際にそのポインタを介して関数を呼び出すことです。

構文は単純です。通常の関数を呼び出すのと同様に、関数ポインタを使用します。

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;
}

ポインタ名の後に、引数を入れた括弧を記述するだけです。C言語は自動的にポインタをデリファレンスし、それが指し示す関数を実行します。

明示的なデリファレンス構文を (*operation)(5, 3) のように使用することもできますが、これは任意であり、あまり一般的ではありません。どちらの形式も同じ結果を生成します。

ポインタを別の関数に再割り当てしたときに、真の力が発揮されます。

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

チャレンジ

簡単

関数ポインタを介した関数の呼び出しと、実行される関数の切り替えを練習しましょう。実行時(ランタイム)に加算と減算を切り替えることができる、シンプルな計算機を作成します。

以下のプログラムを作成してください:

  1. 2つの関数を定義します:
    • add — 2つの int 型パラメータを受け取り、その和を返します
    • subtract — 2つの int 型パラメータを受け取り、1つ目の値から2つ目の値を引いた結果を返します
  2. main 関数内で、2つの int 型パラメータを受け取り int 型を返す関数を指すことができる、calc という名前の関数ポインタを宣言します。
  3. 4つの入力(2つの整数と2つの演算コード)を読み取ります。
  4. 各演算コードに対して以下を行います:
    • 適切な関数を calc に割り当てます(1の場合は add、2の場合は subtract)
    • ポインタを介して、2つの数値を用いて関数を呼び出します
    • 結果を出力します

4つの入力を受け取ります:1つ目の数値2つ目の数値1つ目の演算コード(1または2)、そして2つ目の演算コード(1または2)。

出力は、同じ2つの数値を使用して実行された各演算の結果を、別々の行に表示する必要があります:

15
5

この例では、入力が 10, 5, 1, 2 の場合:最初の演算(コード 1)で 10 + 5 = 15 を計算し、次にポインタが再割り当てされ、2番目の演算(コード 2)で 10 - 5 = 5 を計算します。

これは、呼び出しの間に再割り当てを行うことで、同じポインタ変数がまったく異なるロジックを実行できることを示しています。

チートシート

ポインタを介して関数を呼び出すには、ポインタ名の後に引数を入れた括弧を記述します。

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;
}

明示的なデリファレンス構文 (*operation)(5, 3) を使用することもできますが、これは任意です。

関数ポインタは、実行時に別の関数を指すように再割り当てすることができます。

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

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

これにより、呼び出しの間で再割り当てを行うことで、同じポインタ変数に異なるロジックを実行させることが可能になります。

自分で試してみよう

#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: 2つの int 型パラメータを受け取り int 型を返す関数を指すことができる、
    // 'calc' という名前の関数ポインタを宣言します
    
    
    // TODO: 最初の操作コード (op1) について:
    // - 適切な関数を calc に割り当てます (1 は add、2 は subtract)
    // - ポインタを介して関数を呼び出し、結果を出力します
    
    
    // TODO: 2番目の操作コード (op2) について:
    // - calc を適切な関数に再割り当てします
    // - ポインタを介して関数を呼び出し、結果を出力します
    
    
    return 0;
}
quiz icon腕試し

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

Object Oriented Programmingのすべてのレッスン