文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++程序的函数指针实际操作介绍

2023-06-03 09:38

关注

这篇文章主要介绍“C++程序的函数指针实际操作介绍”,在日常操作中,相信很多人在C++程序的函数指针实际操作介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++程序的函数指针实际操作介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

先看看这段代码:

#includeusing std::cout;using std::endl; inline int min(int a,int b){return (a>b) ? b : a;} int Min(int a,int b,int (*pf)(int,int))//可以使用缺省参数:int Min(int a,int b,int (*pf)(int,int)=min){return pf(a,b); //通过函数指针来调用函数,也可以写为 //return (*pf)(a,b);作用是一样的。} int main(int argc, char* argv[]){int i=1;int j=10; int r=Min(i,j,min); //如果使用缺省参数的话,可以写成:int r=Min(i,j);cout<<1r<1<1endl;return 0;}

其中int (*pf)(int,int)定义了一个返回值为int,参数为两个int的函数指针。如果不在*pf上加括号的话,即:

int *pf(int,int),

编译器会把它解释为一个返回值为整型指针,参数为两个int的函数。

可以用typedef来简化代码:

#includeusing std::cout;using std::endl;typedef int (*PF)(int,int);//这行代码是关键,相当与把上个例子中的函数指针声明为一种数据类型。 inline int min(int a,int b){return (a>b) ? b : a;}int Min(int a,int b,PF f) //PF f定义f为和上个例子中一样的函数指针。{return f(a,b);}int main(int argc, char* argv[]){int i=1;int j=10;int r=Min(i,j,min);cout<<1r<1<1endl;return 0;}

也可以提供一个用模板实现的函数指针:

#includeusing std::cout;using std::endl;inline int min(int a,int b){return (a>b) ? b : a;}templateT Min(T a,T b,T (*pf)(T,T)){return pf(a,b);}int main(int argc, char* argv[]){int i=1;int j=10;int r=Min(i,j,min); //int r=Min(i,j,min); 这种形式编译器会报错:Expression syntaxcout<<1r<1<1endl;return 0;}

当然,这个指针指向的函数也可用模板来实现:

#includeusing std::cout;using std::endl; templateinline T min(T a,T b){return (a>b) ? b : a;}templateT Min(T a,T b,T (*pf)(T,T)){return pf(a,b);}int main(int argc, char* argv[]){long i=2000000;long j=1000000;//使用时有三种形式:long r=Min(i,j,min);//第一种。注意这里在min后一定要加,否则编译器将报错://Could not find a match for "Min(long,long,T(*)(T,T)"//第二种:long r=Min(i,j,min);//第三种:long r=Min(i,j,min);//其实质是一样的。cout<<1r<1<1endl;return 0;}

不过我不能用typedef使代码更为简便,就像下面这种形式:

template

typedef T (*PF)(T,T);

编译器会提示:Templates must be classes or functions

另外还可以使用函数指针的数组:

#includeusing std::cout;using std::endl;inline int min(int a,int b){return (a>b) ? b : a;}inline int max(int a,int b){return (a>b) ? a : b;}int main(int argc, char* argv[]){int i=1;int j=10; int (*pf[2])(int,int);//拥有两个元素的函数指针数组,每个元素是返回值为int,参数为两个int的函数指针。pf[0]=min;pf[1]=max; int r1=pf[0](i,j);int r2=pf[1](i,j);cout<<1r1<1<1endl;cout<1<1r2<1<1endl;return 0;}

指向重载函数的指针也是值得注意的:#include using std::cout;using std::endl;

inline void print(int a){ cout<<1a<1<1endl;}inline void="" print(long="" b){="" cout<1<1b<1<1endl;}int main(int argc, char* argv[]){ int i=1; long m=100000; void (*pf1)(int)=print; void (*pf2)(long)=print; pf1(i); pf2(m);

return 0;}程序运行的很成功。因为编译器会自动查找所有的重载函数,以找到和函数指针指向的函数具有相同的返回类型和参数表的函数。

如上我们可知声明一个给定函数的函数指针的一般规则:即这个函数指针的返回类型和参数表必须和给定的函数相同。要注意省略号也是函数类型的一部分,int function1(int,...)与int function2(int)需要两个不同的函数指针。其实函数名就是指向该函数的指针,对于int function(int)来说,function就是它的指针。我们可用这个特性对函数指针进行初始化:int (*pf)(int)=function;

取地址操作符也可以用在函数名上,上面的代码和int (*pf)(int)=&function的作用是一样的。

到此,关于“C++程序的函数指针实际操作介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯