- 締切済み
C言語 変数型 (*)() の意味を教えて下さい
C言語で書かれたプログラムを見ていると、変数宣言の部分に double (*f)(); のような形で書かれたものがよく出てきます。 これは、どういうことを意味しているのでしょうか? よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
これは、こういう関数をそのまま使うというのではなくて、関数の引数として、関数自身を渡すときに使います。 例えば、こんな関数を考えましょう。 ※説明用 double 三角関数の処理(int 種類) { double temp; double x; for (x = 0; x += 0.1; x < 10) { switch(種類) { case 0: temp = sin(x); break; case 1: temp = cos(x); break; } tempを使った複雑な処理;;;;;; } return 結果; } この関数には問題があります。 ・flag は、1 がsin だっけ? cos だっけ? と読むときにわかりにくい ・この後、tan() も使うとなったら、そのたびに書き換え必要 で、これを、関数引数を使って書き換えると、 double 三角関数の処理(double (*f)()) { double temp; double x; for (x = 0; x += 0.1; x < 10) temp = f(x); tempを使った複雑な処理;;;;;; } return 結果; } と書けます。 呼び出す方は、 三角関数の処理(sin); 三角関数の処理(cos); 呼び出しできますので、このとき計算するのは、cos? sin? とか悩まなくてすみますし、また、 tan() も使いたいというときに、そのまま使えば良いというわけです。
- hashioogi
- ベストアンサー率25% (102/404)
関数ポインタを使用する一例として標準ライブラリのqsort関数があります。 qsortの実体は void qsort (void *base, size_t nmemb, size_t size, int (*hikaku)(const void *a, const void *b)) { qsortの中身 } の形をしています。 int (*hikaku)(const void *a, const void *b) の部分が関数ポインタの仮引数です。 使用者は関数呼び出しの際に比較用に自分で作成した関数を指定すれば、qsort関数がその関数を使用してデータをソートしてくれます。例えば、 long data [10] = {6, 2, 7, 8, 1, 3, 5, 4, 9, 0} ; /* 使用者が自分で昇順用に作成する比較関数 */ int comp (const void *a, const void *b) { long aa, bb ; aa = *((long*) a) ; bb = *((long*) b) ; if (aa > bb) { return 1 ; } else if (aa < bb) { return -1 ; } else { return 0 ; } } /* qsortを使用する関数 */ void func (void) { qsort (data, 10, sizeof (long), comp) ; }
- wormhole
- ベストアンサー率28% (1626/5665)
戻り値の型がdoubleの関数のポインタ