メメメモモ

プログラミング、筋トレ、ゲーム、etc

関数ポインタ

C言語の関数ポインタについて復習しました。

関数ポインタの宣言

関数ポインタの宣言は下記のような形になります。

戻り値の型 (*ポインタ名) (引数のリスト)


例えば、次のようになります。

// 関数ポインタに入れる関数
int sum(int a, int b) 
{
   return a + b;
}


int main(void) 
{
   // sum()関数用のポインタ宣言
   int (*p)(int a, int b);
   
   // 関数ポインタの代入
   p = sum;
}


ポインタの宣言には、入れる予定の関数の戻り値の型と引数を合わせるようにします。

関数の呼び出し

関数ポインタに入っている関数を呼び出すには以下のように記述します。

// 関数ポインタからの呼び出しを明示している書き方
ans = (*p)(1,2);

// p()関数を呼び出しているか関数ポインタを呼び出しているか
ans = p(1,2);

台形形式プログラム

下記は、台形形式で積分をするプログラムです。
trapezoidal関数は、double型の値を返しdouble型の値を引数とする関数を受け取ります。
この引数に任意の関数を渡すようにしています。

#include <stdio.h>

double trapezoidal(double (*f)(double x), double a, double b);
double fx(double x);


int main(void)
{
    double ans = 0.0;

    ans = trapezoidal(fx, 0.0, 2.0);
    printf("%f\n",ans);

    return 0;
}

double fx(double x) {
    return x * x * x;
}

double trapezoidal(double (*f)(double x), double a, double b) {
    int i;
    int N = 5000;
    double x[10000];
    double y[10000];
    double h;
    double S = 0.0;

    h = (b-a)/N;
    for (i = 0; i <= N; i++) {
        x[i] = a + i*h;
    }

    for (i = 0; i <= N; i++) {
        y[i] = (*f)(x[i]);
        y[i+1] = (*f)(x[i+1]);
        S = S + h*(y[i] + y[i+1])/2.0;
    }

    return S;
}