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