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

  • 相关阅读:
    住建部第一批城市更新试点名单
    新城建试点城市
    日常笔记
    简单的C++配置模块
    C++ 异常 OR 错误码
    数独的暴力破解法
    MySQL语法数据库操作 Test
    Python中的staticmethod和classmethod Test
    Python中的__init__()、__new__()、__del__()方法 Test
    MySQL语法数据库表操作 Test
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/6693942.html
Copyright © 2020-2023  润新知