関数ポインタの呼び出し
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におけるポリモーフィズムの基盤です。
チャレンジ
簡単ポインターを通じて function を呼び出し、実行される function を切り替える練習をしましょう。実行時に加算と減算を切り替えられる、シンプルな計算機を作成します。
次の処理を行うプログラムを作成してください。
- two つの function を定義します。
add: two つのintparameters を受け取り、それらの合計を返すsubtract: two つのintparameters を受け取り、first から second を引いた値を返す
main内で、calcと called された function pointer を Declare します。このポインターは、two つのintparameters を受け取り、intを returning する functions を指せます。- four つの inputs(two つの整数と two つの operation コード)を読み取ります。
- 各 operation コードについて、次の処理を行います。
- appropriate function を
calcに Assign します(add は 1、subtract は 2) - two つの数値を使い、pointer を通じて function を Call します
- result を print します
- appropriate function を
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;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ