写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.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;
那么,综合文中这所有的基础知识,我们就得到了一个归纳性的程序:
#includeusing namespace std;typedef int A;typedef void (*PF)();typedef int (*P_Adder)(double,long);void hello(){ cout<<"hello"<
TZ
2017/4/11于华中农业大学