[C言語] 関数を指すポインタ

double f1(double x) {
    return x+1.0;
}

int main(void) {
    
    double (*p)(double) = f1; // ポインタpに関数fをセット

    double ans = p(5.0);

    printf("p(5.0)=%g\n", ans);

    return 0;
}

$ gcc main.c -o main && ./main
p(5.0)=6

ポインタは値、配列だけでなく、関数も指すことができる

#include<stdio.h>
#include<math.h>

double f1(double x) {
    return x+1.0;
}

double f2(double x) {
    return x+2.0;
}

int main(void) {
    
    double (*p)(double) = f1; // ポインタpに関数fをセット

    double ans1 = p(5.0);
    double ans2, ans3;

    p = f2;

    ans2 = p(5.0);

    p = sqrt;
    ans3 = p(2.0);

    printf("ans1=%g, ans2=%g, ans3=%g\n", ans1, ans2, ans3); // 6.0, 7.0, 4.0

    return 0;
}

$ gcc main.c -o main -lm && ./main
ans1=6, ans2=7, ans3=1.41421
コンパイル時に-lmオプションがないとエラーになる

double f1(double x) {
    return x+1.0;
}

double f2(double x) {
    return x+2.0;
}

double f3(double x) {
    return x+3.0;
}

int main(void) {
    
    double (*p[3])(double) = {f1, f2, f3}; // ポインタpに関数fをセット
    int k;
    for (k=0; k<3; k++){
        double ans = p[k](5.0);
        printf("p[%d](5.0)=%g\n", k, ans); // 6.0, 7.0, 8.0
    }

    return 0;
}

$ gcc main.c -o main -lm && ./main
p[0](5.0)=6
p[1](5.0)=7
p[2](5.0)=8

これはそのまま

typedef double(*funcTable[3])(double); // 関数を指すポインタの配列型

int main(void) {
    
    funcTable p = {f1, f2, f3};
    int k;
    for (k=0; k<3; k++){
        double ans = p[k](5.0);
        printf("p[%d](5.0)=%g\n", k, ans); // 6.0, 7.0, 8.0
    }

    return 0;
}

このように書くことができる