関数ポインタ、関数を指すポインタを返します.


正確に言えば、本文に関連する内容はC++の中で理解しにくい.本文の目的はそれらをはっきり説明することではない.これはあなたが順番に漸進的に多くの練習をしなければならないからだ.次の例を見てみましょう.
int (*func(bool real))(int, int) 

戻り値は何だと思いますか?
ここでは,関数を指すポインタをどのように理解するかについて述べる.いくつかのC++教材からの提案は中から外へこの表現式を解読することで、ここでいわゆる中はfunc(bool real)で、残りの部分はいわゆる戻り値ですか?ちょっと硬いかな.次は、どのように理解すればいいかを順番に見てみましょう.
この式の戻り値に疑問を抱くのはなぜですか?
問題を解決するには、通常、問題の所在を見つける必要があります.ここでは、変数を宣言する方法に慣れているという考え方に基づいています.
int a;
ここではaがintタイプの変数であることを宣言する.戻り値についても、intタイプの戻り値を持つ関数は、通常、次のように宣言できます.
int func([params]);
したがって,戻り値は最も左側のタイプ名であると慣性的に考えられるが,これは通常正しいが,上記の例では気まずい.
関数を指すポインタの宣言式を見てみましょう.
int (*pCompare)(int, int); 

このポインタの名前はpCompareですが、不思議なことにpCompareは宣言式全体の右端ではなく、タイプもintではなく複雑な式です.typedefで宣言すると、typedefの使用も違います.
typedef int (*PF)(int, int); 

私たちは慣用的なtypedef***と???を発見しました.上記のtypedefの後、式全体を簡略化することができます.
PF pCompare; 

今では、現在の式は規則的に見え、通常の宣言はタイプ名と変数名で宣言を完了し、関数ポインタの宣言は式の固定された位置で宣言されています.
int (* )(int, int); 

上で線を引いた部分が宣言された部分であり、その違いが私たちを徐々に方向を見失わせている.
次に、関数を指すポインタを返す関数、すなわち戻り値がPFの関数を書きます.これは、intタイプの変数を返す関数からintタイプの値を返す関数までのように、次の方法で行えます.
PF func([params]);
PFを拡張し,それを復元し,すなわち右側のfunc([params])部分をその横線の位置に移す.本稿の冒頭の関数を簡単に理解できます.元はint(*)(int,int)を返す関数です.
int (*func(bool real))(int, int) 

上に線を引いた部分は、1つの関数から戻り値を差し引いた部分です.に等しい
PF func(bool real) 

これでもっと複雑な表現を分析できるはずです.
次の例は、本明細書の理解を支援することを目的としています.
#include

#include

using
std::cout; using
std::endl; int
myCompare1( int a,int
b, int (*Compare)(int,int
)); int realCompare(inta,int
b); int fakeCompare(inta,int
b); typedef int (*PF)(int,int
); int
myCompare2( int a,int
b, PF Compare); PF getAPointerFunc1(bool
real); int (*getAPointerFunc2(boolreal))(int,int
); int main(void
){ int
typeDeclared; typeDeclared = 1
; //PF pCompare;
    int(*pCompare)(int,int
); if(pCompare==
NULL) cout<<"pCompare == NULL"<<
endl; else
{ cout
<<"pCompare != NULL"<<"pComapre = "<endl; } cout<<"Compare the pointer function."<<
endl; cout<<"The compare result is :"<<
myCompare1(
6,5, realCompare)<<
endl; cout<<"It's the same to invoke realCompare & *realCompare :"<<
myCompare1(
6,5,*realCompare)<<
endl; cout<<"Using the typedef to predigest definition :"<<
myCompare2(
8,7, realCompare)<<
endl; cout<<"Return a pointer from a function :"<<
myCompare2(
10,20, getAPointerFunc1(true))<<
endl; cout<<"Return a pointer from a function :"<<
myCompare2(
20,30, getAPointerFunc2(false))<<
endl; return
EXIT_SUCCESS; } int
myCompare1( int a,int
b, int (*Compare)(int,int
)){ return
Compare(a, b); } int realCompare(inta,int
b){ cout<<"The realCompare has be invoked."<<
endl; if(a==
b) return 0
; if(a<
b) return -1
; else
return1
; } int fakeCompare(inta,int
b){ cout<<"The fackCompare has be invoked."<<
endl; return 200
; } int
myCompare2( int a,int
b, PF Compare){ return
Compare(a, b); } PF getAPointerFunc1(bool
real){ if
(real) return
realCompare; else return
fakeCompare; } int (*getAPointerFunc2(boolreal))(int,int
){ if
(real) return
realCompare; else return
fakeCompare; }
関数ポインタの呼び出し例:
#include<iostream>
using namespace std;
void hello(int a){
 cout<<a<<endl;
}
void (*world)(int);
int main(){
 world=hello;
 world(50);
 return 0;
}

#include<iostream>
using namespace std;
void f(int a){
 cout<<a<<endl;
}
int main(){

 typedef void (*p)(int a);
 p x;
 x=&f;
 x(5);
 return 0;
}