関数ポインタの使用

関数ポインタは、その名前が示すようにポインタです。ポインタであるため、この変数はアドレスを格納するために使用され、アドレスの内容にアクセスする機能を備えています。

命名形式は次のとおりです。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;
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Genius_bin/article/details/113662278