• 締切済み

C言語 変数型 (*)() の意味を教えて下さい

C言語で書かれたプログラムを見ていると、変数宣言の部分に double (*f)(); のような形で書かれたものがよく出てきます。 これは、どういうことを意味しているのでしょうか? よろしくお願いいたします。

  • q07p
  • お礼率37% (3/8)

みんなの回答

回答No.3

これは、こういう関数をそのまま使うというのではなくて、関数の引数として、関数自身を渡すときに使います。 例えば、こんな関数を考えましょう。 ※説明用 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)
回答No.2

関数ポインタを使用する一例として標準ライブラリの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% (1621/5656)
回答No.1

戻り値の型がdoubleの関数のポインタ

関連するQ&A

  • C言語のStatic変数について

    現在、C言語の勉強しながらゲームプログラムにチャレンジしています。 二つの関数で利用する変数を作りたかったので、Static宣言された変数を容易しました。 ですが、この変数、一度処理が終わると当面使わない変数なのです。 (ただし、処理途中は何度も呼び出されるので値は保持しなければいけません) よって、メモリ上に延々居座られるのが邪魔に思えて仕方ありません。 実際、大したことないだろうとは思うのですが。 このStaticで宣言された変数を、自分の好きなタイミングでメモリ上から解放するような処理はできませんか? もしくはメモリ上に居座ることのない処理の仕方などありましたら、 考え方を教えていただけるとうれしいです。よろしくお願いします。

  • C言語 関数の戻り値と自動変数

    かなり基礎的な質問になるのですが、疑問に思うことがあり、質問をさせていただきます。 関数内で宣言した変数を戻り値として使う場合ですが、ポインタなどではなく実体の場合でも、静的変数として宣言をしたほうが良いのでしょうか? 現実的に考えると、プログラムが関数から出て、呼び出した側の関数が戻り値を受け取るまでの瞬間に、その領域が書き換えられる可能性は極めて低いと思うのですけど、C言語の仕様としてはどうなのでしょうか? 関数内で宣言した戻り値に使う変数には、必ずstaticをつけた方が良いのでしょうか? もしおわかりでしたら教えて下さい。

  • C言語で1度に使用可能な変数の個数

    C言語で1度に使用可能な変数の個数について。 仮にメモリ3GB・32ビットのPCを用いたとして。 1つのプログラム中でdouble型の変数は最大何個使えるのでしょうか。 単に 3000000000/8 と考えても良いのでしょうか? 馬鹿な質問ですが宜しくお願いします。

  • CとC++の変数宣言について

    なぜC言語では変数の宣言をブロックの先頭でする必要があるのかがわかりません。 またC++がどこででも宣言できるのもなぜか教えてください

  • C言語での変数の書式設定

    こんばんは。 このたびC言語を学びはじめたのですが、変数の書式設定の部分で分からない部分があったので、質問させていただきました。 分からない部分というのは%ld,%hd,(%lf)(%hf)です。(()内に書いたのは存在するか分かりませんが・・・。) これらはshortやlongで整数(実数)を表現する書式だと書いてあったのですが、具体的に何がどう違うのかがよくわかりません。 ためしにlong型で宣言した変数を%hdで表示してみたらshort型で表現できる数のみしか正常に表示されませんでした。しかし、short型で宣言した変数を%ldで表示してみても何も変化が見られません。また、実数に関してはよくわからない値が返ってきてしまいました。 変数で宣言した型と実際に使う書式が合致するか否かでは一体何がどう変化するのでしょうか? 初歩的なことかもしれませんが、以上の疑問の答えを知っていらっしゃる方がいましたら、どうかご教授ください。お願いいたします。

  • グローバル変数について (C言語)

    C言語でグローバル変数についての質問です。 変数のスコープはなるべく狭いほうがいいと言われたのですが、これはなぜでしょうか?ローカル変数よりもグローバル変数のほうが実行速度が遅くなったりするのでしょうか? 回答よろしくお願いします。

  • C言語でπを2万桁まで計算するには

    C言語でπの値を2万桁まで(2万という数字に特に意味はないですが大きい桁)をマーチンの公式を用いて計算したいのです。 マーチンの公式によるπの求め方は 16×アークタンジェント(1/5) - 4×アークタンジェント(1/239) ということは分かったのですが double型の変数を使っても扱える桁数はたかがしれているので どのようにすればアークタンジェント(1/5)などの値を C言語のプログラムで大きい桁まで求めることができるのでしょうか。 また何かうまい具合に計算できるアルゴリズムなどがありましたら 教えてください。 詳しい方いましたら、よろしくお願いします。 もしよければ参考プログラムなども 貼り付けていただけたら幸いです。

  • C言語プログラムエラーについて

    C言語(CCS)でPICに書き込むためのプログラムを書いているのですが、 main関数内でfloat a[10]と宣言するとエラーは出ないのでが、 float a[100]にするとエラーが出てしまいます。 実数の配列を100個以上宣言したいのですが、doubleは使えないので どうすれば良いのかわかりません。 よろしくお願いします。

  • C言語(引数)

    はじめまして。 C言語を習い始めたものです。 関数を定義するとき、よく耳にする、仮引数や実引数があると思います。 仮引数は関数の定義内で値をうけとる変数のことであり 実引数は関数を呼び出す際に渡す値を実引数というらしいのですが どこからどこまでを仮引数と呼ぶのかわかりません。 例えば、 fの関数の定義内で ↓があるとします。 (関数にする意味はないのですが、確認のためあしからず・・・) double f(double x) {     x=5;     return(x); } この場合、仮引数とよばれるものは double f(double x)の xが仮引数であって x=5;のxは仮引数と呼ばないのでしょうか?? もしそうならば void f(double x) { printf("%f",x); } のprintf("%f",x);内のxは仮引数とよぶのでしょうか? 質問の内容が意味不明かもしれませんが よろしくお願いします。

  • C言語のローカル変数の使い方について質問です。

    C言語の変数に関しての質問です。 グローバル変数を使わずに、関数内で宣言したローカルの変数を別のソースファイルで使用することって可能ですか? 例えば、a.cというソースファイルと、b.cというソースファイルがあります。 a.cの関数内で"FILE *fp;"と宣言したローカル変数を、b.cの関数内で共有して使うことはできるのでしょうか。 また、"fp"に直接アクセスはできなくても、間接的にアクセスできる方法があれば教えてください。 下に記述しているのは例え用に適当に書いたプログラムです。 --------------------- a.cのソースファイル --------------------- void Temp(void) { char file_name[128] = {}; errno_t error; FILE *fp; // ←この変数を別のソースで使いたいです scnaf_s("%s", file_name, 128); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません"); return 0; } fclose(fp); } --------------------- b.cのソースファイル --------------------- void Temp2(void) { int size; // ここでa.cのTemp関数で宣言されている"fp"を使いたい fseek( fp, 0, SEEK_END ); fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); }

専門家に質問してみよう