C++函数指针定义、调用及作为参数传递详解
在C++编程中,指针不仅可以指向变量和数组,还可以指向函数的入口地址。本文将详细介绍如何定义指向函数的指针变量,如何通过该指针调用函数,以及利用函数指针作为参数实现通用函数的设计与应用。
理解函数指针与定义方法
函数在编译时会被分配一个唯一的入口地址,这个地址被称为函数的指针。使用指针变量指向该地址后,即可通过指针间接调用函数。
定义指向函数的指针变量的语法结构如下:
int (*p) (int ,int );
各部分含义解析:
int:表示指针所指向的函数返回值为整型。(*p):表示p是一个指向函数的指针变量(括号不可省略)。(int,int):表示该函数接受两个整型参数。
对比普通函数原型:
int max(int, int);
可以看出,两者在返回值类型和参数列表上必须保持一致,否则无法正确赋值。
基本调用示例
以下示例展示了如何使用常规方法和函数指针两种方式求三个整数中的最大值。
第1步:常规方法调用
直接调用函数 max,逻辑清晰但耦合度高。
#include <iostream>
using namespace std;
int main(){
int max(int x,int y);
int a,b,c,m;
cout<<"Please input three integers:"<<endl;
cin>>a>>b>>c;
// 直接嵌套调用
m=max(max(a,b),c);
cout<<"Max="<<m<<endl;
return 0;
}
int max(int x,int y){
int z;
if(x>y)
z=x;
else
z=y;
return z;
}
第2步:定义指针并调用
定义函数指针 p,将其指向 max 函数,随后通过指针进行调用。这种方式允许在运行时动态选择函数。
#include <iostream>
using namespace std;
int main(){
int max(int x,int y);
// 定义函数指针 p,指向返回int且含两个int参数的函数
int (*p) (int x,int y);
p=max; // 将函数名(入口地址)赋给指针
int a,b,c,m;
cout<<"Please input three integers:"<<endl;
cin>>a>>b>>c;
// 方式一:(*p)(...) 调用
m=(*p)((*p)(a,b),c);
cout<<"Max="<<m<<endl;
return 0;
}
int max(int x,int y){
int z;
if(x>y) z=x;
else z=y;
return z;
}
第3步:简化调用语法
C++标准允许直接使用指针名称加括号的方式调用,无需额外解引用符,代码更加简洁。
// ... 前置代码相同 ...
// 方式二:p(...) 调用
m=p(p(a,b),c);
cout<<"Max="<<m<<endl;
高级应用:函数指针作为参数
函数指针最常见的用途是将函数作为参数传递给另一个函数。这使得被调函数可以根据传入的不同函数地址,执行不同的逻辑,从而实现“通用函数”的设计。
场景示例:通用幂运算器
假设需要计算以下三个表达式的值:
- y1 = (x+1)^1
- y2 = (2x+3)^2
- y3 = (x^2+1)^3
我们可以编写一个通用函数 Squar,它接收底数生成函数指针和指数,从而统一处理不同底数的幂运算。
完整代码实现
#include <iostream>
#include <math.h>
using namespace std;
// 子函数1:计算 x+1
double fun1(double n){
return n + 1;
}
// 子函数2:计算 2x+3
double fun2(double n){
return 2*n + 3;
}
// 子函数3:计算 x^2+1
double fun3(double n){
return (pow(n,2)+1);
}
// 通用函数:计算 power(base(x), exponent)
// 参数说明:
// a: 指数
// x: 输入给基础函数的变量
// p: 指向基础函数的指针
double Squar(int a, double x, double(*p)(double )){
double r, z;
z = (*p)(x); // 调用传入的函数计算底数
r = pow(z, a); // 计算底数的a次方
return r;
}
int main(){
// 函数原型声明
double fun1(double n);
double fun2(double n);
double fun3(double n);
double Squar(int a, double x, double(*p)(double ));
double x;
cout<<"Please input x:";
cin>>x;
// 通过传递不同的函数名(指针),复用Squar函数
cout<<"(x+1)^1=" << Squar(1,x,fun1) << endl;
cout<<"(2x+3)^2=" << Squar(2,x,fun2) << endl;
cout<<"(x^2+1)^3=" << Squar(3,x,fun3) << endl;
return 0;
}
通过上述例子可以看出,使用函数指针可以将算法逻辑(如幂运算)与数据变换逻辑(如底数计算)分离,提高代码的复用性和扩展性。
以上就是C++函数指针定义、调用及作为参数传递的详细内容,更多关于C++指针与函数应用的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









