Cプログラミング · 1 min read · Nov 22, 2025

Linux C プログラミングチュートリアル パート 25 - 関数ポインタ

これまでのCプログラミングチュートリアルシリーズでは、ポインタの基本概念や、配列へのポインタやポインタの配列など、ポインタに関連するいくつかの側面について説明してきました。ポインタの理解を深めるために、このチュートリアルでは関数へのポインタの概念について説明します。

Cプログラミング言語における関数ポインタ

変数へのポインタがあるように、関数へのポインタも存在します。以下は関数ポインタの宣言の例です:

void (*fn_ptr)(int)

ここでは、整数を入力として受け取り、voidを返す任意の関数を指すことができる関数ポインタ「fn_ptr」を定義しています。言うまでもなく、これは宣言部分に過ぎません。他のポインタと同様に、使用するにはアドレス(この場合は関数のアドレス)を割り当てる必要があります。

以下はこのポインタを使用した例です:

#include   
  
void print_int(int a)  
{  
 printf("\n 整数の値は: %d\n",a);  
}  
  
int main()  
{  
 void (*fn_ptr)(int);  
 fn_ptr = &print_int;  
 (*fn_ptr)(10);  
  
 return 0;  
}

ご覧の通り、最初に整数を受け取り、voidを返す関数「print_int」を定義しました。次に、「main」関数内で「fn_ptr」を「print_int」のような関数を指すことができる関数ポインタとして宣言しました。その後、「print_int」関数のアドレスを「fn_ptr」に割り当て、最後にポインタを使用して関数を呼び出しました。

生成された出力は次のとおりです:

整数の値は: 10 

ここで言及すべきことは、最後の2行から&と*を省略することでこのプログラムをさらに簡素化できるということです。以下は修正されたコードです:

#include   
  
void print_int(int a)  
{  
 printf("\n 整数の値は: %d\n",a);  
}  
  
int main()  
{  
 void (*fn_ptr)(int);  
 fn_ptr = print_int;  
 fn_ptr(10);  
  
 return 0;  
} 

次に、ポインタの配列のように、関数ポインタの配列も持つことができます。例えば、以下は3つの関数アドレスを格納できる関数ポインタの配列です。

void (*fn_ptr[3])(int)

以下はこのポインタの配列を使用した例です:

void print_int1(int a)  
{  
 printf("\n 整数の値は: %d\n",a);  
}  
  
void print_int2(int a)  
{  
 printf("\n 整数の値は: %d\n",a+1);  
}  
  
void print_int3(int a)  
{  
 printf("\n 整数の値は: %d\n",a+2);  
}  
  
int main()  
{  
 void (*fn_ptr[3])(int);  
   
 fn_ptr[0] = print_int1;  
 fn_ptr[1] = print_int2;  
 fn_ptr[2] = print_int3;  
   
 fn_ptr[0](10);  
 fn_ptr[1](10);  
 fn_ptr[2](10);  
  
 return 0;  
}

このコードによって生成された出力は次のとおりです:

整数の値は: 10   
   
整数の値は: 11   
   
整数の値は: 12

関数ポインタについて知っておくべきもう一つの側面は、関数引数としても使用できるということです。例えば、関数ポインタを引数として受け取る関数を作成できます。例えば:

void some_random_func(void (*fn_ptr)(int)) 

以下はこの関数を利用したコードの例です:

#include   
  
void another_random_func(int a)  
{  
 printf("\n 入力された整数は: %d\n", a);  
}  
  
void some_random_func(void (*fn_ptr)(int))  
{  
 fn_ptr(5);  
}  
  
int main()  
{  
 some_random_func(another_random_func);  
 return 0;  
}

ここで私たちが行ったのは、入力として関数ポインタを受け取る「some_random_func」という関数を作成したことです。次に、「main」から「another_random_func」のアドレスを引数として「some_random_func」を呼び出しました。そしてポインタを使用して、「another_random_func」を正常に呼び出しました。

出力は次のとおりです:

入力された整数は: 5 

結論

関数ポインタは、「コールバックメカニズム」と呼ばれるものを作成したいときに便利です(詳細についてはここをお読みください)。しかし、その前にこの概念をしっかり理解しておくことが重要です。このチュートリアルの例をローカルマシンで試してみることをお勧めします(新しいものを作成することも)。疑問や質問がある場合は、下にコメントを残してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。