関数ポインタは、その名前が示すようにポインタです。ポインタであるため、この変数はアドレスを格納するために使用され、アドレスの内容にアクセスする機能を備えています。
命名形式は次のとおりです。int(* p)(int、int)、double(* fun)(double、double)などの関数戻り値タイプ(*ポインター名)(関数パラメータータイプ
)
関数ポインタについては、古典的な例から学ぶことができます。
関数プロセスを設計し、呼び出されるたびに異なる関数を実装し、2つの数値の合計と差、および2つの数値の大きい方の値を見つけます。
分析:関数ポインタをプロセス関数のパラメータとして使用して、さまざまな関数のエントリアドレスを渡し、さまざまな結果を得ることができます。
まず、より大きな値を取得するために、合計、差、比較という3つの関数の特定のコード実装を作成する必要があります。
これは次のように定義されます。
int maxi(int& a, int& b) {
return a > b ? a : b;
}
int mini(int& a, int& b) {
return a > b ? b : a;
}
int sum(int& a, int& b) {
return a + b;
}
関数名は、次の3つの関数へのポインタを定義できる関数のアドレスであること
を理解する必要があります。
int(*fun)(int&,int&) = maxi;//fun指针存放的是 maxi 函数的地址
プロセス関数の定義は非常に単純になります。内部にポインターを実装するだけで、このポインターを使用して他の関数を呼び出し、値の転送を完了できます。これは次のように定義されます。
int process(int& val1, int& val2,int(*fun)(int&, int&)) {
return (*fun)(val1, val2);//
}
「*」と「ポインタ変数」は、ポインタ変数に格納されているアドレスの内容を示します。つまり、ポインタ変数pが格納されているアドレスを示し、
* pはwhoです。
完全なコード:
int process(int& val1, int& val2,int(*fun)(int&, int&)) {
return (*fun)(val1, val2);
}
int maxi(int& a, int& b) {
return a > b ? a : b;
}
int mini(int& a, int& b) {
return a > b ? b : a;
}
int sum(int& a, int& b) {
return a + b;
}
int main() {
int a = 10;
int b = 20;
int(*fun)(int&,int&) = maxi;//fun指针存放的是 maxi 函数的地址
cout << "函数地址:" << maxi << " " << fun << endl;
cout << "函数指针使用:" << endl;
cout << "调用了maxi函数:" << endl << process(a, b, maxi) << endl << "调用了mini函数:" << endl << process(a, b, mini) << endl << "调用了sum函数:" <<endl<< process(a, b, sum);
return 0;
}