• ベストアンサー

よく分からない関数?がある

プログラミングが良く分かっていないため、このプログラムを読みきる事ができませんでした。 #include <stdio.h> int (*get_sign)(); int iget_sign(int *a); int dget_sign(double *a); main(){ int sgn, idt=5; //intを2つ作成。idtは5 double fdt = -3.234; //ダブル型のfidを作成、数値は-3.234 get_sign = iget_sign; //不明:get_sigin sgn = get_sign(&idt); //get_siginにidtの数値を渡してsgnにいれてる printf("*date:%d sgn:%d\n",idt ,sgn); get_sign = dget_sign; sgn = get_sign(&fdt); printf("*data:%lf sgn:%d\n", fdt, sgn); } int iget_sign(int *a){ if(*a == 0) return 0; else if(*a > 0) return 1; else return -1; } int dget_sign(double *a){ if(*a == 0) return 0; else if(*a > 0.0) return 1; else return -1; } 数値が0なら0を、プラスなら1をマイナスなら-1を返すプログラムだと言うことは分かります。 しかし、2行目の「int (*get_sign)();」や10行目の「get_sign = iget_sign; //不明:get_sigin」が良く分かりません。 ぜひアドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・ポインタ変数には、変数が格納されている場所を指し示すものと  関数が格納されている場所を指し示すものの2つがあります。  今回は関数の場所を示すものとして get_sign という関数ポインタがあります。  この関数へのポインタは  int型用の iget_sign()  double型用の dget_sign()  の関数アドレスを保持します。 ・最初に『get_sign = iget_sign;』の行で関数ポインタ get_sign は iget_sign() 関数の  格納されている場所(アドレス)をセットします。その次の行で『sgn = get_sign(&idt);』  として呼び出すと iget_sign() 関数を呼び出したことになります。 ・次に『get_sign = dget_sign;』の行で関数ポインタ get_sign は dget_sign() 関数の  格納されている場所(アドレス)をセットします。だから次の行で『sgn = get_sign(&idt);』  として呼び出すと dget_sign() 関数を呼び出したことになるのです。 ・よって関数ポインタ get_sign の内容(関数へのアドレス)によって get_sign() 関数を  呼び出したとき iget_sign()か、dget_sign() のどちらの関数を呼び出すかが決定されます。  なお、関数ポインタを利用するには普通の変数へのポインタと同様に必ず初期化してから  使います。これをしないと実行時にどのような動作になるか分かりません。  また何も(関数へのポインタが)セットされていない場合には NULL としておけば  『if ( get_sign == NULL ) { エラー処理; }』とか、  『if ( get_sign != NULL ) { get_sign(引数); }』とか  することで安全対策が取れます。  ※今回は関数ポインタ get_sign がグローバル変数ですので明示的に NULL を  ※セットしなくても最初から get_sign に NULL が入っています。  ※ローカル変数の場合には注意して下さい。→自分で NULL とか入れて初期化。

nanacy01
質問者

お礼

丁寧な解説ありがとうございます。 おかげさまで理解する事が出来ました。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

変数はメモリのどこかに格納されるのでアドレスを持つ、 ということはおわかりですね。 関数もまたしかりです。

nanacy01
質問者

お礼

関数もポインタが使えるんですね。 勉強になりました。ありがとうございます。

  • manima2
  • ベストアンサー率16% (11/66)
回答No.1

こんにちは。 「関数ポインタ」ってわかります? 調べてみてはどうでしょう。

nanacy01
質問者

お礼

関数にもポインタが使えるんですね。 知りませんでした。ありがとうございました。

関連するQ&A