Ã¥×¥í¥°¥é¥ß¥ó

.
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
.