【シリーズ】C/C++関数ポインタ詳細-2


3.4関数ポインタをパラメータとする
関数のパラメータメカニズムを理解し、3.3節の内容を完全に理解し、実践している場合は、この節は簡単です.関数のパラメータリストで、関数ポインタタイプのパラメータを宣言してから呼び出したときに実パラメータに渡すだけです.関数ポインタの付与文の等号をパラメータと実パラメータを結合したモードに置き換えればいいと想像できます.
簡単な例を次に示します.
     /* 
*Author:Choas Lee 
*Date:2012-02-28 
*/ 
#include<stdio.h> 
float add(float a,float b){return a+b;} 
float minus(float a,float b){return a-b;} 
float multiply(float a,float b){return a*b;} 
float divide(float a,float b){return a/b;} 
int pass_func_pointer(float (*pFunction)(float a,float b)) 
{ 
      float result=pFunction(10.0,12.0); 
      printf("result=%f
",result); } int main() { pass_func_pointer(add); pass_func_pointer(minus); pass_func_pointer(multiply); pass_func_pointer(divide); return 0; }

出力結果:
result=22.000000 
result=-2.000000 
result=120.000000 
result=0.833333 

3.5関数ポインタを戻り値として使用する
関数ポインタは戻り値として使用できます.まずクラス比で考えてみましょう.整数型が戻り値として使用できるとしたら、関数をどのように宣言しますか.ええ、次のようなものです.
int func(){}
整数に対応するタイプはintです.同じようにクラス比以下で、整数ポインタが戻り値として使用できるとしたら、どう宣言しますか?うん、これは難しくないようです.
int * func(){}
では、関数ポインタが戻り値として使用できる場合は、どのように宣言しますか?まず保証すべき点は、返される関数ポインタのタイプが、この関数の宣言または定義形式に明確に表現されなければならないことである.すなわち、この形式では、関数ポインタに対応する関数タイプを決定できる情報を含めることができる.この関数タイプの返される値タイプ、この関数タイプのパラメータの個数、この関数タイプのパラメータタイプ.、
クラスを1回比較し、浮動小数点ポインタを返す場合は、戻りタイプを次のように表現します.
float *
関数ポインタに対応する関数が戻り値が浮動小数点型であり、2つのパラメータがあり、2つのパラメータが浮動小数点型である場合、戻りタイプはfloat(*)(float,float)と表現されるべきである.
まあ、仕方ないですが、関数の意味は複雑で、対応する表現は形式の複雑さです.浮動小数点ポインタとして返される場合、定義された関数の名前は「float*」の後ろに、上のタイプの関数ポインタとして返される場合、定義された関数は「(*)」という括弧の中の*の後ろに置かれます.
したがって、次の形式について説明します.
float (* func(char op) ) (float ,float)
具体的には、次のような関数が宣言されています.
lその名前はfuncであり、そのパラメータの個数は1個である.
lその各パラメータのタイプは、op-char;
lその戻り変数(関数ポインタ)タイプは、float(*)(float,float)である
もう一度強調します:関数ポインタの時変数ですよ.
ここに着いたら、unixのシステム呼び出し関数signalの定義形式を分析します.
void (*signal (int signo,void (*func)(int) ) )  (int);
具体的には、次のような関数が宣言されています.
lその関数名は:signal
lそのパラメータの個数は:2
l各パラメータのタイプはsigno-int,func-void(*)(int)である
l返される変数(関数ポインタ)のタイプは、void(*)(int)である
上の関数は古典的で、パラメータタイプが関数ポインタで、戻り値が関数ポインタなのか、それとも関数ポインタなのかがあります.
/* 
*Author:Choas Lee 
*Date:2012-02-28 
*/ 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
float add(float a,float b){return a+b;} 
float minus(float a,float b){return a-b;} 
float multiply(float a,float b){return a*b;} 
float divide(float a,float b){return a/b;} 
float(* FunctionMap(char op) )(float,float) 
{ 
      switch(op) 
      { 
             case '+': 
                    return add; 
                    break; 
             case '-': 
                    return minus; 
                    break; 
             case '*': 
                    return multiply; 
                    break; 
             case '\\': 
                    return divide; 
                    break; 
             default: 
                    exit(1); 
      } 
} 

int main() 
{ 
      float a=10,b=5; 
      char ops[]={'+','-','*','\\'}; 
      int len=strlen(ops); 
      int i=0; 
      float (*returned_function_pointer)(float,float); 
      for(i=0;i<len;i++) 
      { 
             returned_function_pointer=FunctionMap(ops[i]); 
             printf("the result caculated by the operator %c is %f
",ops[i],returned_function_pointer(a,b)); } return 0; }

計算結果は次のとおりです.
the result caculated by the operator + is 15.000000 
the result caculated by the operator - is 5.000000 
the result caculated by the operator * is 50.000000 
the result caculated by the operator \ is 2.000000