関数ポインターの宣言
関数へのポインターです。
「関数ポインターの宣言」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 関数ポインターの宣言
- 関数の受け渡し
- 比較関数付き qsort
- 関数ポインターテーブル