一番簡単な例は、次のような感じ。
#include <stdio.h>
int func(int x)
{
return x * x;
}
int main()
{
int (*p)(int);
p = &func;
printf("%d\n", (*p)(3));
return 0;
}
|
この例は関数へのポインタを使う意味は無いが、「どの関数を呼び出すか 実行時に決めたい」ようなときに役に立つ。 例えば、次のようなNewton法のプログラムを考える。
#include <stdio.h>
double func(double x)
{
return x * x - 2.;
}
double newton(double x)
{
int i;
double d;
for (i=0; i<10; i++) {
d = (func(x + 0.01) - func(x)) / 0.01;
x = x - func(x) / d;
}
return x;
}
int main()
{
printf("%.15g\n", newton(1.));
return 0;
}
|
funcは解きたい方程式 (x2-2=0) を表している。 newtonでは、刻み0.01の差分で微分値を近似しつつ、Newton法を10回 行っている。 このような書き方だと、解きたい方程式を変えたいときや、 同じプログラム中で解きたい方程式が複数あったとき、newtonの中の 関数呼び出し部分(func)を書き換える必要が出てしまう。 このままでは、newton関数がNewton法を行うための汎用の「部品」にならない。 この問題は、次のようにnewton関数が解くべき問題を関数ポインタで渡してやる ことにより解決できる。
#include <stdio.h>
double func(double x)
{
return x * x - 2.;
}
double func2(double x)
{
return x * x * x - 5.;
}
double newton(double x, double (*f)(double))
{
int i;
double d;
for (i=0; i<10; i++) {
d = (f(x + 0.01) - f(x)) / 0.01;
x = x - f(x) / d;
}
return x;
}
int main()
{
printf("%.15g\n", newton(1., func));
printf("%.15g\n", newton(1., func2));
return 0;
}
|