8-6 <発展> 関数のポインタ

この記事は約2分で読めます。

本トピックは発展的な内容を扱うので飛ばして構いません。一通りC言語の学習を終えてから見ることをお勧めします。

変数や配列のポインタを考えることができましたが、関数に対してもポインタを考えることができます。

//変数へのポインタの定義
型名 *ポインタ名;
//関数へのポインタの定義
返却値型 (*ポインタ名) (仮引数);

返却値型と仮引数型とは、ポインタが指す関数の型です。関数の返却値型と仮引数型は変数の型に対応します。変数のポインタを定義するときは、通常の変数の定義に*をつけてポインタを定義しました。関数へのポインタを定義するときは、関数のプロトタイプ宣言と同じ形に*をつけます。

#include <stdio.h>
void func1(void) {
	puts("func1を実行中");
}
int main(void) {
	void (*p)(void) = func1;
	p();
	return 0;
}

実行結果

func1を実行中

このプログラムでは返却値型void、仮引数型voidの関数へのポインタpを定義しています。p();とすると、ポインタが指す関数func1を呼び出されます。(*p)();としても呼び出せます。

また、関数のポインタも普通のもインタと同様に引数に使用することができます。

#include <stdio.h>
void func(void);
void callFunc10times(void (*)(void));

int main(void) {
	int i;
	callFunc10times(func);
	return 0;
}
void func(void) {
	static int n=0;
	n++;
	printf("func:%d回目\n",n);
}
void callFunc10times(void (*p)(void)){
	int i;
	for (i=0;i<10;i++) (*p)(); 
}

実行結果

func:1回目
func:2回目
func:3回目
func:4回目
func:5回目
func:6回目
func:7回目
func:8回目
func:9回目
func:10回目

返却値型void、引数型voidの関数ポインタを引数として受け取りそれを10回呼び出す関数callFunc10timesを定義しました。プロトタイプ宣言では引数名を省略できるため、void (*)(void)としました。

コメント