Un puntero de función, como su nombre lo indica, es un puntero, al ser un puntero, esta variable se utiliza para almacenar la dirección y tiene la función de acceder al contenido de la dirección.
El formato de nomenclatura es: tipo de valor de retorno de función (* nombre de puntero) (tipo de parámetro de función)
como int (* p) (int, int), double (* fun) (double, double)
Podemos aprender acerca de los punteros de función a través de un ejemplo clásico:
diseñar un proceso de función, implementar diferentes funciones cada vez que se llame y encontrar la suma y la diferencia de dos números y el valor mayor de los dos números.
Análisis: Podemos usar el puntero de función como parámetro en la función de proceso para pasar la dirección de entrada de diferentes funciones y obtener diferentes resultados.
En primer lugar, necesitamos escribir la implementación del código específico de las tres funciones, a saber, suma, diferencia y comparación para obtener un valor mayor.
Se define de la siguiente manera:
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;
}
Necesito entender si el nombre de la función es la dirección de la función
, podemos definir un puntero a estas tres funciones:
int(*fun)(int&,int&) = maxi;//fun指针存放的是 maxi 函数的地址
La definición de la función de proceso se vuelve muy simple: solo necesita implementar un puntero internamente y usar este puntero para llamar a otras funciones para completar la transferencia de valor. Se define de la siguiente manera:
int process(int& val1, int& val2,int(*fun)(int&, int&)) {
return (*fun)(val1, val2);//
}
'*' más 'variable de puntero' indica el contenido de la dirección almacenada en la variable de puntero , en resumen, la dirección de cuya
variable de puntero p está almacenada, entonces * p es quién.
Código completo:
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;
}