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于华中农业大学

原文地址:https://www.cnblogs.com/acm-icpcer/p/6693942.html