Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年3月7日に更新

第2章53 関数ポインタを扱う

イチからゲーム作りで覚えるC言語
第2章52 ビットフィールドを扱う : PREV
NEXT : 第2章54 関数ポインタと構造体を合わせて使う :

概要

C言語で関数ポインタを扱うことで、例えばキャラクタの行動や計算式を変数のように差し替えたりして 管理することが出来ます。

簡単な例を元に、関数ポインタの使い方を確認していきます。

関数ポインタ例

どんな行動や計算式を使うかを、変数のように管理できます。

 
funcpointer_ex.c
#include <stdio.h>
int calc(int money) { return money * 2; }
int main() {
    int (*action)(int money) = &calc;
    int money = action(100);
    printf("お金を %d ゴールド拾いました\n", money);
}

こちらを実行すると下のような結果になります。

実行結果
お金を 200 ゴールド拾いました

プログラムを確認していきます。

2 行目では関数ポインタで扱う関数が定義されています。

 
funcpointer_ex.c
int calc(int money) { return money * 2; }

この関数自体は今まで作ってきた普通の関数で、 一つの int 型整数を引数としてもち、結果を int 型整数で返します。

10 を渡せば、2倍して 20 を返すような単純な関数ですね。

 
funcpointer_ex.c
int main() {
    int (*action)(int money) = &calc;
    int money = action(100);

3 行目で関数ポインタを使用しています。

関数ポインタは下のように定義します。

関数ポインタの使い方
ポインタ先の関数の戻り型  (*関数ポインタ名)(ポインタ先の関数の引数) = &関数のポインタアドレス

今回は、事前に定義していた calc という関数を使用します。 右辺では &calc としており、これは関数 calc が定義されているメモリアドレスを表します。

左辺では関数 calc への関数ポインタ変数として、 action を定義しています。 この action が変数のようなもので、今回は calc を action の関数ポインタに代入します。

int (*actoin)(int money) で、戻り値が int 型の、関数ポインタ変数 action を宣言しています。 また、関数の引数は calc と合わせて、int 型を1つもちます。

続いて 4 行目では、関数ポインタの action を使用して calc 関数の中身を呼び出しています。

関数ポインタを使うメリット

今回のようなプログラムであれば、直接 calc 関数を呼び出せば良いですが、 ある関数の中で、一部の動きだけを変えたいなどの場合には、 関数に関数ポインタを渡して、動きを変えたい部分のみ実行内容を変更することが出来ます。

例えば、C言語の標準で用意されている qsort という並び替え(ソート)をする関数は、下のように定義されています。

qsort定義
void qsort(void *base, size_t nmemb, size_t size,
                  int (*compar)(const void *, const void *));

第4引数に int (*compar)(const void*, const void *)) と記述があり、 ここには、「戻り値の型が int 型で、二つのポインタ変数の引数をもつ関数」が入るよ、という定義になっており、 どういった順番で配列の中身を並び替え(ソート)するかの関数を代入することで、ソートの処理を一部、自分の関数を使って 処理することができます。

※具体的な qsort の使用例は「2章51 - qsort」をご参照ください。

関数を実行する側と、実行される側で分離できる

関数ポインタを構造体に持たせることで、 構造体のデータ事の振る舞いを定義しておくことが出来ます。

具体的に構造体に関数ポインタを持たせる例を次回確認していきます。

参考文献

  • なし
イチからゲーム作りで覚えるC言語
第2章52 ビットフィールドを扱う : PREV
NEXT : 第2章54 関数ポインタと構造体を合わせて使う :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第1章01 Visual Studio Community 2019 のインストール手順

#C11仕様#C言語#ゲームプログラミング✎ 2021-08-08
C言語でプログラミングをするために、無料で使える Visual Studio Community を使った開発環境を揃えていく手順や注意点をお話しています。
目次
第2章53 関数ポインタを扱う
第2章53 関数ポインタを扱う
概要
概要
関数ポインタ例
関数ポインタ例
関数ポインタを使うメリット
関数ポインタを使うメリット
関数を実行する側と、実行される側で分離できる
関数を実行する側と、実行される側で分離できる
参考文献
参考文献
Nodachisoft © 2021