. Cプログラミング (2015) . 補足資料 関数へのポインタ 松田七美男 2015 年 11 月 12 日 関数へのポインタ . 関数の仮引数としてポインタ変数を宣言すれば,それは実引数への別名と して機能する. . 次の例では,関数 foo() は,ポインタ変数 z を宣言している.よって,main 関数内 部で,実引数(固定ポインタ値)&x を与え て呼び出すと,ポインタ変数 z は変数 x を 指すことになる.ポインタ変数がさす先の 値を読み書きするには間接参照演算子*を 用いる. . void foo(double *z) { *z = 100; } int main(){ double x = 0.0; foo(&x); printf("%.12f\n", x); }. return 0; 同様に関数へのポインタ変数が宣言でき る.関数の名前は固定ポインタであるか ら,単に cos と記述して呼び出すことがで き(&cos という記述も可),関数 bar() に 関数 cos() や sin() のポインタ値が渡され て,cos(1.0) や sin(1.0) が実行される. . void bar(double (*z)()) { printf("%.12f\n", z(1.0)); } int main() { bar(cos); bar(sin); }. return 0; 関数へのポインタの応用 数学関数名 f と値 x を引数に起動して,f (x) を計算するプログラムの例を示す.関数の名 前の文字列と関数へのポインタ(数学関数ライブラリに登録されている関数名そのもの)と の対を構造体として宣言しいている. . #include #include #include #include <stdio.h> <stdlib.h> <string.h> <math.h> . typedef struct { char *fn; double (*fp)(); } function; int main(int argc, char **argv) { int i; double x = M_PI/3; function func[] = { {"sin", sin}, {"cos", cos}, {"tan", tan}, {"exp", exp}, {"log", log} }; . function fin = {"sin", sin}; } . if (argc > 1) { fin.fn = argv[1]; for (i = 0; i < 5; i++) { if (strcmp(fin.fn, func[i].fn) == 0) { fin.fp = func[i].fp; break; } } } if (argc > 2) x = atof(argv[2]); printf("%s(%f) = %f\n", fin.fn, x, fin.fp(x)); return 0; . 実行例 .. $ ./a.out sin(1.047198) = 0.866025 $ ./a.out cos 1.0 cos(1.000000) = 0.540302 .
© Copyright 2024 ExpyDoc