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; }
このように書くことができる