• 函数指针


     在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址来调用数组数据,也可以使用指针变量指向函数代码的首地址来调用函数,指向函数代码首地址的指针变量就称为函数指针。

    1.函数指针定义

    函数类型 (*指针变量名)(形参列表);

    “函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

    例如:

    int (*f)(int x);

    double (*ptr)(double x);

    在定义函数指针时请注意:
       
    函数指针和它指向的函数的参数个数和类型都应该是—致的;

    函数指针的类型和函数的返回值类型也必须是一致的。

    2.函数指针的赋值

    函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

    例如,

    int func(int x);   /* 声明一个函数 */

    int (*f) (int x);    /* 声明一个函数指针 */

     把函数的地址赋值给函数指针,可以采用下面两种形式:
          
    f=&func;            /* 将func函数的首地址赋给指针f */   
    f=func;

    赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
    第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

    3、下面给出一个示例程序:


    #include <stdio.h>
    void (*fp)(); //函数指针: 指向函数的指针包含了函数的地址,可以通过它来调用函数

    void (*fp_para)(char *);//带参数的函数指针


    void func_para(char *s);
    void func();

    int main(void)
    {
        fp_para=&func_para;//或者:fp_para=func_para;

        (*fp_para)("This is the parameter of the funtion!");

        fp=&func;//或者:fp=&func;

        (*fp)();

        return 0;
    }

    void func_para(char *s)
    {
        printf("%s/n", s);
    }

    void func()
    {
        printf("This function has no parameter!/n");
    }

    关于C++中函数指针的使用(包含对typedef用法的讨论)
    (一)简单的函数指针的应用。
    //形式1:返回类型(*函数名)(参数表)
    char (*pFun)(int);
    char glFun(int a){ return;}
    void main()
    {
        pFun = glFun;
        (*pFun)(2);
    }

            第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。
            第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。
            然后就是可爱的main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。
    (二)使用typedef更直观更方便。
    //形式2:typedef 返回类型(*新类型)(参数表)
    typedef char (*PTRFUN)(int);
    PTRFUN pFun;
    char glFun(int a){ return;}
    void main()
    {
        pFun = glFun;
        (*pFun)(2);
    }

            typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
            第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。
    (三)在C++类中使用函数指针。
    //形式3:typedef 返回类型(类名::*新类型)(参数表)
    class CA
    {
     public:
        char lcFun(int a){ return; }
    };
    CA ca;
    typedef char (CA::*PTRFUN)(int);
    PTRFUN pFun;
    void main()
    {
        pFun = CA::lcFun;
        ca.(*pFun)(2);
    }

            在这里,指针的定义与使用都加上了“类限制”或“对象”,用来指明指针指向的函数是那个类的这里的类对象也可以是使用new得到的。比如:
    CA *pca = new CA;
    pca->(*pFun)(2);
    delete pca;

            而且这个类对象指针可以是类内部成员变量,你甚至可以使用this指针。比如:
            类CA有成员变量PTRFUN m_pfun;
    void CA::lcFun2()

       (this->*m_pFun)(2);
    }

            一句话,使用类成员函数指针必须有“->*”或“.*”的调用。

  • 相关阅读:
    Array 对象-sort()
    vue安装
    前端面试题
    JavaScript对象原型
    CSS如何水平垂直居中?
    块格式化上下文(Block Formatting Context,BFC)
    盒子模型
    前端基础
    Markdown语法
    浏览器 滚动条 占据 y轴宽度的解决方案
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167942.html
Copyright © 2020-2023  润新知