0Pricing
C Academy · レッスン

関数ポインターの宣言

関数へのポインターです。

「関数ポインターの宣言」はCoddyKit上の無料C Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

関数にもアドレスがある

データと同じように、すべての関数はメモリ上のアドレスに配置されます。関数ポインタはそのアドレスを保持するため、関数を間接的に呼び出せます。

#include <stdio.h>

void greet(void) { printf("hello\n"); }

int main(void) {
    void (*fp)(void) = greet;
    fp();
    return 0;
}

宣言を読み解く

int (*fp)(int)という宣言は、fpがintを受け取りintを返す関数へのポインタであることを意味します。

*fpを囲む括弧は必須です。

#include <stdio.h>

int square(int x) { return x * x; }

int main(void) {
    int (*fp)(int) = square;
    printf("%d\n", fp(5));
    return 0;
}

関数の代入

関数名はそのアドレスに変換されるため、fp = squareとfp = &squareは同じ意味です。

#include <stdio.h>

int dbl(int x) { return x * 2; }

int main(void) {
    int (*fp)(int);
    fp = &dbl;
    printf("%d\n", fp(7));
    return 0;
}

ポインタ経由で呼び出す

関数ポインタは、fp(args)または明示的な(*fp)(args)で呼び出せます。どちらも同じ動作をします。

#include <stdio.h>

int add1(int x) { return x + 1; }

int main(void) {
    int (*fp)(int) = add1;
    printf("%d\n", fp(10));
    printf("%d\n", (*fp)(10));
    return 0;
}

シグネチャを一致させる

関数ポインタの型には、戻り値の型とパラメータの型が含まれます。シグネチャが完全に一致する関数だけを代入できます。

#include <stdio.h>

double half(double x) { return x / 2.0; }

int main(void) {
    double (*fp)(double) = half;
    printf("%f\n", fp(9.0));
    return 0;
}

実行時の再代入

関数ポインタも変数なので、プログラムの実行中に別の関数を指すよう変更できます。

#include <stdio.h>

int inc(int x) { return x + 1; }
int dec(int x) { return x - 1; }

int main(void) {
    int (*op)(int) = inc;
    printf("%d\n", op(5));
    op = dec;
    printf("%d\n", op(5));
    return 0;
}

条件による選択

実行時の値に基づいて呼び出す関数を選び、その後、1つのポインタを通して呼び出します。

#include <stdio.h>

int plus(int a) { return a + 10; }
int minus(int a) { return a - 10; }

int main(void) {
    int up = 1;
    int (*op)(int) = up ? plus : minus;
    printf("%d\n", op(100));
    return 0;
}

読みやすくするtypedef

関数ポインタの構文は冗長です。typedefで型に名前を付けると、宣言がわかりやすくなります。

#include <stdio.h>

typedef int (*IntOp)(int);

int triple(int x) { return x * 3; }

int main(void) {
    IntOp op = triple;
    printf("%d\n", op(4));
    return 0;
}

2つの引数を取る関数

関数ポインタでは、どのようなシグネチャでも表現できます。ここでは、整数2つを使う二項演算用の例を示します。

#include <stdio.h>

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

int main(void) {
    int (*op)(int, int) = sum;
    printf("%d\n", op(3, 4));
    return 0;
}

NULL関数ポインタ

データポインタと同じように、関数ポインタにもNULLを設定できます。設定されていない可能性がある関数ポインタは、呼び出す前に必ず確認してください。

#include <stdio.h>

int twice(int x) { return x * 2; }

int main(void) {
    int (*op)(int) = NULL;
    if (op == NULL) op = twice;
    if (op) printf("%d\n", op(8));
    return 0;
}

アドレスを表示する

保持されているアドレスを確認できます。関数ごとにアドレスは異なります。

#include <stdio.h>

int f(int x) { return x; }

int main(void) {
    int (*fp)(int) = f;
    printf("function pointer is %s\n", fp ? "set" : "null");
    return 0;
}

理解度チェック

関数ポインタの宣言についての理解度を確認しましょう。

まとめ

関数ポインタの宣言と使い方を学びました。

  • 構文は、括弧が必須のret (*name)(params)です。
  • 関数名を使って代入します(関数名はアドレスに変換されます)。
  • fp(args)または(*fp)(args)で呼び出します。
  • シグネチャを一致させる必要があり、typedefで読みやすくできます。

よくある質問

「関数ポインターの宣言」レッスンは無料ですか?

はい。「関数ポインターの宣言」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「関数ポインターの宣言」で何を学びますか?

関数へのポインターです。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「関数ポインターの宣言」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数ポインターの宣言
  2. 関数の受け渡し
  3. 比較関数付き qsort
  4. 関数ポインターテーブル
← C Academyに戻る