C++函数指针
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/6693942.html
C++函数指针
C++中的函数指针是一个很重要但是很令人头疼的东西,往往很容易忘记它的语法和用法,有的时候会因为一点点小细节而导致编译不通过。那么,本着巩固基础的目的,我写了这篇总结文章。
1.首先,明确基本语法:
数据类型 (* 函数指针名字)(形参列表)
例如:void (*pf)();
这个语句定义了一个名为pf的指向void类型的、没有形参的函数
如果要让我们定义好的这个函数指针指向一个指定类型的函数(例如:void hello(){cout<<"hello"<<endl;}),那么应该这样:
pf=&hello;
也可以写成“pf=hello;”。因为函数名字本身就代表一个地址,c++为了照顾一些老鸟级程序员所以保留了“pf=&hello;”语法类型。
那么综合以上知识我们写出第一个测试程序:
#include<iostream>
using namespace std;
void hello()
{
cout<<"hello"<<endl;
}
int main()
{
void (*pf)();//define a function pointer which refers to a void function
pf=&hello;//"pf=hello" is also ok
(*pf)();
}
输出为:hello
2.函数指针的形式参数问题:
我们已经知道了基本语法是:数据类型 (* 函数指针名字)(形参列表)
如果碰到有形参,甚至形参还不止一个的函数,怎么定义它的指针呢?
例如,对于函数:
int inc(int x)
{
return x+1;
}
可以这样写:
int (*p_inc)(int x)=inc;
或者这样写:
int (*p_inc)(int)=inc;
相对的,要调用就这样:
cout<<(*p_inc)(1)<<endl;
就会显示结果为2.
同理,对于有多个参数的函数,例如:
int adder(double x,long y)
{
return x+y;
}
可以这样写:
int (*p_adder)(double,long)=adder;
cout<<(*p_adder)(1,1)<<endl;
结果显示为2。
3.一般,老鸟们为了简化c++函数指针的语法,喜欢用typedef:
typedef最基本的用法是给数据类型起一个你自己喜欢的别名
例如:typedef int A;那么之后你就可以在程序中用“A”来替代“int”了
那么,处于简化函数指针语法的目的,比如,对于1中的:void (* pf)();
一般会这样写:
typedef void (*PF)();
那么之后在使用的时候,只要
PF pf;
pf=hello;
即可以啦。
同理。对于2中的指针,我们改为:
typedef int (*P_Adder)(double,long);
P_Adder p_adder=adder;
那么,综合文中这所有的基础知识,我们就得到了一个归纳性的程序:
#include<iostream>
using namespace std;
typedef int A;
typedef void (*PF)();
typedef int (*P_Adder)(double,long);
void hello()
{
cout<<"hello"<<endl;
}
A inc(A x)
{
return x+1;
}
int adder(double x,long y)
{
return x+y;
}
int main()
{
PF pf;
pf=hello;
(*pf)();
int (*p_inc)(int)=inc;
cout<<(*p_inc)(1)<<endl;
P_Adder p_adder=adder;
cout<<(*p_adder)(1,1)<<endl;
return 0;
}
TZ
2017/4/11于华中农业大学
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY