Menu
Coddy logo textTech

関数ポインタの宣言

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

ここまでは、構造体の埋め込みを使用して継承をシミュレートする方法を学びました。しかし、異なるオブジェクトが同じ呼び出しに対して異なる応答をする真のポリモーフィズムを実現するには、さらに別のものが必要です。それが関数ポインタ(function pointer)です。

関数ポインタ(`function` `pointer`)は、関数のアドレスを記憶する変数です。通常のポインタがデータのアドレスを保持するのと同様に、関数ポインタは実行可能コードのアドレスを保持します。

構文は最初、威圧的に見えるかもしれません。関数ポインタを宣言するには、戻り値の型を指定し、続いてアスタリスクを付けたポインタ名を括弧内に記述し、その後にパラメータの型を続けます。

int (*operation)(int, int);

これは、2つの int 型の parameters を受け取り intreturn する任意の function を指すことができる operation という called 変数を Declare します。*operation の周りの括弧は非常に重要です。これらがないと、pointerreturning する function を宣言することになってしまいます。

このポインタに関数を代入するには、単に関数の名前(括弧なし)を使用します:

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

int (*operation)(int, int);
operation = add;  // これで operation は add を指します

関数名はそのアドレスとして機能します。明示的に &add を使用することもできますが、これはオプションです。C言語ではどちらの形式も等価です。

challenge icon

チャレンジ

簡単

関数ポインタの宣言と、それらへの関数の代入を練習しましょう。関数ポインタが異なる算術関数を保持できる簡単な数学演算システムを作成します。

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

  1. 2つの関数を定義します:
    • multiply — 2つの int パラメータを受け取り、それらの積を返します
    • subtract — 2つの int パラメータを受け取り、最初の値から2番目の値を引いた結果を返します
  2. main 関数内で、2つの int パラメータを受け取り int を返す関数を指すことができる operation という名前の関数ポインタ変数を宣言します
  3. 3つの入力(2つの整数と演算コード:1は multiply、2は subtract)を読み込みます
  4. 演算コードに基づいて、operation ポインタに適切な関数を代入します
  5. 代入された演算の名前を出力し、次にポインタを介して関数を呼び出した結果を出力します

入力として、最初の数値2番目の数値、および演算コード(1または2)の3つの値が渡されます。

出力は以下のようになります:

Operation: multiply
Result: 35

ここで、multiply は演算名(コードが 2 の場合は subtract)、35 はポインタを介して関数を呼び出した結果です(この場合、5 × 7)。

覚えておきましょう:関数ポインタを宣言するには、戻り値の型、アスタリスクを付けたカッコ括りのポインタ名、およびパラメータの型が必要です。関数を代入するには、カッコをつけずに関数名のみを使用します。

自分で試してみよう

#include <stdio.h>

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


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


int main() {
    int num1, num2, code;
    
    // 入力を読み取る
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: 'operation' という名前の関数ポインタを宣言する。これは
    // 2つの int パラメータを取り int を返す関数を指せる
    
    
    // TODO: 操作コードに基づいて(1 は multiply、2 は subtract)、
    // 適切な関数を operation ポインタに割り当てる
    
    
    // TODO: 操作名と結果を出力する
    // フォーマット:
    // Operation: <name>
    // Result: <result>
    
    return 0;
}
quiz icon腕試し

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

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