カテゴリ: C++ 更新日: 2026/02/10

C++関数ポインタの基本と利用シーンを完全攻略!初心者向け解説ガイド

関数ポインタの基本と利用シーン
関数ポインタの基本と利用シーン

先生と生徒の会話形式で理解しよう

生徒

「先生、C++のポインタって『データの住所』を指すものですよね?でも、調べたら『関数の住所』を指すポインタもあるって聞いたんですが……。」

先生

「その通りです!それを『関数ポインタ』と呼びます。データだけでなく、プログラムの『動き』そのものを変数に入れて持ち運べるようになるんですよ。」

生徒

「動きを変数に入れる……?何だか難しそうですが、どんな時に使うんですか?」

先生

「例えば、リモコンのボタンに好きな機能を割り当てるようなイメージです。一歩ずつ、未経験の方でもわかるように丁寧に説明しますね!」

1. 関数ポインタとは?

1. 関数ポインタとは?
1. 関数ポインタとは?

C++のプログラミングにおける関数(かんすう)とは、特定の処理をひとまとめにした「命令のセット」のことです。そして、通常の変数と同じように、関数もパソコンのメモリ(作業スペース)のどこかに保存されています。

関数ポインタとは、その関数が保存されている「場所(住所)」を格納するための特別な変数です。 これを使うと、プログラムを実行している最中に「次に実行する命令を切り替える」といった、非常に柔軟な動きが可能になります。

パソコンを触ったことがない方への例え話: キッチンに「和食の作り方」「洋食の作り方」という2つのレシピ本があるとします。関数ポインタは、今どちらのレシピを読むべきか指し示している「しおり」のようなものです。この「しおり」を挟み替えるだけで、作る料理(実行する処理)を変えることができるのです。

2. 関数ポインタの基本的な書き方

2. 関数ポインタの基本的な書き方
2. 関数ポインタの基本的な書き方

関数ポインタの書き方は、少し独特です。最初は難しく見えるかもしれませんが、「戻り値の型」「ポインタの名前」「引数の型」の3つのパーツで構成されていることを意識しましょう。

引数(ひきすう)とは:
関数に渡す「材料」のことです。例えば、足し算をする関数なら、足したい2つの数字が引数になります。

では、実際に簡単な計算を行う関数ポインタのプログラムを見てみましょう。


#include <iostream>

// 挨拶を表示する簡単な関数
void sayHello() {
    std::cout << "こんにちは!" << std::endl;
}

void sayGoodbye() {
    std::cout << "さようなら!" << std::endl;
}

int main() {
    // 関数ポインタの宣言(戻り値なし、引数なしの関数を指す)
    void (*funcPtr)();

    // sayHello関数の住所を代入
    funcPtr = sayHello;
    funcPtr(); // 「こんにちは!」が実行される

    // 指し示す先を sayGoodbye に変更
    funcPtr = sayGoodbye;
    funcPtr(); // 「さようなら!」が実行される

    return 0;
}

実行結果:


こんにちは!
さようなら!

3. 引数がある関数ポインタ

3. 引数がある関数ポインタ
3. 引数がある関数ポインタ

次は、数字を材料として受け取る(引数あり)関数を指すポインタを使ってみます。 関数ポインタを宣言する際に、カッコの中に「どんな材料を受け取るか」を書いておく必要があります。


#include <iostream>

// 2つの数字を足す関数
int add(int a, int b) {
    return a + b;
}

// 2つの数字を掛ける関数
int multiply(int a, int b) {
    return a * b;
}

int main() {
    // 整数を2つ受け取って整数を返す関数ポインタ
    int (*calcPtr)(int, int);

    calcPtr = add;
    std::cout << "足し算の結果: " << calcPtr(5, 3) << std::endl;

    calcPtr = multiply;
    std::cout << "掛け算の結果: " << calcPtr(5, 3) << std::endl;

    return 0;
}

実行結果:


足し算の結果: 8
掛け算の結果: 15

このように、calcPtr という一つの変数が、ある時は足し算、ある時は掛け算の役割を演じることができるようになります。

4. 利用シーン:コールバック関数

4. 利用シーン:コールバック関数
4. 利用シーン:コールバック関数

関数ポインタが最も活躍するのが「コールバック関数」という仕組みです。 これは、「ある処理が終わったら、この関数を呼び出してね!」と予約しておく方法です。

例えば、スマートフォンのボタンをイメージしてください。 ボタン自体は「押されたこと」を検知する機能だけを持っています。 「ボタンが押された時に何をするか(写真を撮る、音楽を流すなど)」を関数ポインタとしてボタンに渡しておくことで、ボタンの種類を増やさずに入れ替え可能な機能を実現できます。

5. 関数を「引数」として渡すテクニック

5. 関数を「引数」として渡すテクニック
5. 関数を「引数」として渡すテクニック

関数ポインタを使うと、関数を別の関数の「引数(材料)」として渡すことができます。 これにより、汎用性の高い(使い回しができる)便利なプログラムが作れます。


#include <iostream>

// 計算を実行する汎用的な関数。3つ目の引数に関数ポインタを受け取る
void performOperation(int x, int y, int (*operation)(int, int)) {
    std::cout << "計算を開始します..." << std::endl;
    std::cout << "結果: " << operation(x, y) << std::endl;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    // 引き算の関数を「材料」として渡す
    performOperation(10, 4, subtract);
    return 0;
}

実行結果:


計算を開始します...
結果: 6

この performOperation 関数は、中身を書き換えなくても、渡す関数を変えるだけで足し算にも掛け算にも対応できる「万能な計算機」になります。

6. 関数ポインタの注意点と安全な使い方

6. 関数ポインタの注意点と安全な使い方
6. 関数ポインタの注意点と安全な使い方

非常に強力な関数ポインタですが、未経験の方が陥りやすい注意点もあります。

  • 住所が「空」の状態に注意: 住所録に何も書いていない(nullptr)状態で関数を呼び出そうとすると、プログラムが急に終了してしまいます。
  • 型を合わせる: 指し示す先の関数と、ポインタの宣言(戻り値や引数)が1文字でも違うと、エラーになります。

現代のC++では、もっと安全で書きやすい std::function という仕組みも用意されていますが、その基礎となっているのは今回学んだ関数ポインタです。基本を理解することで、より高度な技術もスムーズに習得できるようになります。

7. プログラミングの世界を広げる「動きの管理」

7. プログラミングの世界を広げる「動きの管理」
7. プログラミングの世界を広げる「動きの管理」

パソコンを触ったことがない方にとって、これまでの話は少し魔法のように感じられたかもしれません。 しかし、私たちが普段使っているアプリやゲームも、実はこの「条件や設定に合わせて、次にどの命令(関数)を呼ぶか切り替える」という仕組みの積み重ねでできています。

関数ポインタをマスターすることは、単にコードを書く技術だけでなく、「効率的なシステムの設計図」を描く能力に繋がります。 データだけでなく「動き」まで自分の思い通りに操れるようになると、プログラミングはもっと楽しくなりますよ!

カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.4
Java&Spring記事人気No4
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.5
Java&Spring記事人気No5
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.6
Java&Spring記事人気No6
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作