精华内容
下载资源
问答
  • c++返回函数指针的函数

    千次阅读 2021-07-17 20:43:05
    返回函数指针的函数函数指针指针函数返回函数指针的函数 函数指针 类似于数组名,在C语言中函数名的实际就是函数所在空间的首地址,故也可声明相应类型的函数指针用于指向相应的实际函数,更深层次甚至可以声明...

    函数指针


    1. 类似于数组名,在C语言中函数名的实际就是函数所在空间的首地址,故也可声明相应类型的函数指针用于指向相应的实际函数,更深层次甚至可以声明函数指针数组和返回函数指针的函数。

    2. 定义格式:声明函数指针时需要指出返回类型和所有形参类型,即对于指向int add(int a,int b);的函数指针可以声明为

      int (*p)(int ,int ) = add;

      这里的p即为指向add的函数指针,注意*p左右的括号不可省略,否则优先级原则p前面的*会和int结合从而变成int* p(int, int);即被理解为对函数p的声明,返回值为整型指针。

    指针函数


    1. 返回指针的函数,有必要区分于函数指针的概念

    返回函数指针的函数


    1. C++不允许定义返回函数的函数,但可以定义返回函数指针的函数来实现同python类似的事情,即函数的返回值是一个指向另一个函数的指针,故对其返回值又可传入实参进行并列调用(如:fun1(a,b)(a,b);这里假设fun1的返回值是指向fan2的指针故后面两个参数即是传给fun2的实参)

    2. 定义格式:和普通函数的区别主要在于定义时函数的返回值类型,函数返回值的类型应该是指向某类函数的函数指针类型,但由于该类型实际书写方式复杂,故可考虑为该指针类型创建别名,然后同普通数据类型一样直接写在函数名之前表达返回该类型就行了

      //e.g:
      using funp = int(*)(int, int);
       // <==>typedef int(*funp)(int, int);
       
       int add(int a, int b) {
       	return a + b;
       }
       funp fun(int& a, int& b) {
       	int temp = a;
       	a = b;
       	b = temp;
       	return add;
       }
       
       int main() {
       	int a = 5, b = 10;
       	fun(a, b)(a, b);
       	return 0;
       }
      

      这里的funp就是对int( )(int,int)类型的函数指针创建的别名,在定义返回该函数指针类型的函数时直接定义funp fun(…){…}就行。

    展开全文
  • 因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明一个函数指针,只需要用指针替换函数名即可,例如:比较字符串长度的函数:bool LengthCompare(const string &amp;, const string ...

           函数指针指向的是函数而非对象。和其他类型一样,函数指针指向某种特定类型。因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明一个函数指针,只需要用指针替换函数名即可,例如:

    比较字符串长度的函数:bool LengthCompare(const string &, const string &);

    此函数的函数指针为:    bool (*pf)(const string &, const string &);

    pf指向一个函数,函数的参数是两个const string的引用,返回值是bool类型。*pf两端的括号必不可少,如果不写会变成:

    bool  *pf  (const string &, const string &);  此时pf是一个返回值为bool指针的函数。


    函数指针的使用:

    1、当把函数名作为一个值使用时,该函数自动地转换为指针。

    pf = LengthCompare;            //pf指向名为LengthCompare的函数

    pf = &LengthCompare;         //等价的赋值语句,取地址符是可选的

    同时,直接使用指向函数的指针调用该函数时,无须提前解引用指针。

    bool b1 = pf("hello", "world");                          //调用LengthCompare函数

    bool b2 = (*pf)("hello", "world");                      //一个等价的调用

    bool b1 = LengthCompare("hello", "world");   //另一个等价的调用

    2、函数指针形参(正向调用和反向调用,反向调用即回调函数)

          利用函数指针形参,函数调用和任务的编写可以分开。这样的话,这要是这个函数类型的函数,传入不同的函数名,就能执行不同的函数体,用这种方法实现了类似于C++多态的形式。

            回调函数是利用函数指针实现的一种调用机制,回调机制原理: 当具体时间发生时,调用者通过函数指针调用具体函数,回调机制将调用者和被调函数分开,两者互不依赖。

            回调函数应用举例:

    #include <iostream>
    using namespace std;
    
    typedef void (*callback)(int x);            // 定义一个函数指针类型
    
    void myFunc1(int x)                         // myFunc1 的声明要与callback一样
    {
        cout << "This is myFunc1 " << x << endl;
    }
    
    void myFunc2(int x)
    {
        cout << "This is myFunc2 " << x << endl;
    }
    void callMyFunc(callback cb, int x)      // 把函数指针类型当做调用函数参数类型
    {
        cb(x);
    }
    
    int main()
    {
        callMyFunc(myFunc1, 1);
        callMyFunc(myFunc2, 2);
    
        return 0;
    }


    3、返回指向函数的指针

           和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针,但是,我们必须把返回类型写成指针形式,因为编译器不能自动地将函数返回类型当成对应的指针的类型处理。声明返回函数指针的函数简单的办法就是使用类型别名。

            返回函数指针应用举例:

    #include<iostream>
    
    using namespace std;
    using F = int(*)(int);
    
    
    int a(int m){return m;}
    
    F f1(){return a;}
    
    int main()
    {
        cout << "function a(10) vaule is: " << a(10) << endl;
        cout << "function f1()(5) vaule is: " << f1()(5) << endl;
        return 0;
    }



    展开全文
  • 函数指针一些知识 (1) , 在mj下拉刷新中遇到了定义的一个宏,看起来比较晦涩,如下 #define msgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__) 其实就是把objc_msgSend函数指针强制转换...
    函数指针一些知识
    (1) ,  在mj下拉刷新中遇到了定义的一个宏,看起来比较晦涩,如下
    #define msgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__)
    其实就是把objc_msgSend函数指针强制转换成另一种类型((void (*)(void *, SEL, UIView *)))的函数指针,
    所以这个宏表示的就是一个个函数指针
    (void (*)(void *, SEL, UIView *))这一坨其实表示的是一个函数指针(指向一个函数的指针,这个函数返回值为void,有3个参
    数),前面这一坨的意思就是把objc_msgSend这个函数指针转换成这一坨的指针类型。这样的好处就是可以限制这个宏接受的3个参数必须是这一坨中的3个参数。
    调用的时候,可以这么调用:
    objc_msgSend(ivar1,ivar2,ivar3);
    这与(*objc_msgSend)(ivar1,ivar2,ivar3);是等价的。
    下面分析为什么他们是等价的?
    void (*funcPtr)(); // 这是一个函数指针
    void *funcPtr();  //  这是一个函数
    主要取决于运算符的优先级, funcPtr是应该先与坐边的*结合还是与右边的()结合, 因为函数运算符() 的优先级要高于单目运算符*,所以如 果没有括号那就先与()结合,那么它就是一个函数。

    在《C陷阱与缺陷》中有这样一段描述:

    fp是一个函数指针,那么*fp就是该指针所指向的函数,所以(*fp)()就是调用该函数的方式。ANSI C标准允许程序员将上式简写为fp(),但是一定要记住这种写法只是一种简写形式。

    在表达式void (*func)()中,*func两侧的括号非常重要,因为函数运算符()的优先级要高于单目运算符*。如果*func没有括号,那么*func实际上与*(func())的含义完全一致,ANSI C把它写作*(*(fp)())的简写形式。

    根据以上的描述,我们似乎可以得到这样一个结论:

           1. func是一个函数指针

           2. func()(*func)()的一个简写形式

           3. &func&(*func)的简写形式

    如果这样理解正确的话,那么上面那段代码就顺理成章了。用宏定义了一个函数指针,然后使用的时候展开宏,就是调用一个函数指针,也就等同于调用这个函数objc_msgSend,因为objc_msgSend(...) 是等同于(*objc_msgSend)(...)的。

    下面是一个面试题:
    void * (*(*fp1)( int))[ 10];  // 表示的什么?

    我们从里向外一点一点分析,首先(*fp1)(int),这说明fp1是一个函数指针,它有一个int类型的参数;然后我们来找这个函数指针类型的返回值,注意到*(*fp1)(int),所以我们可以断定它的返回值是一个指针,指针指向什么呢?

    我们可以看到最外层剩余的部分是void* [10],因此这个函数的返回值是一个指针,这个指针指向一个包含十个void*类型数据的数组。

    综上:fp1 是一个函数指针,它所指向的函数有一个int 类型的参数,并且这个函数的返回值是一个指针,这个指针指向一个包含10 void* 元素的数组。
    总结最重要的一点:
            (*fp1)( int) 说明它是一个函数指针,这个好理解,然后再与左边*结合 * (*fp1)(int),说明它的返回值是一个指针,就如同:
    int *func()说明这个函数指针的返回值是一个指针,指针的类型为int。
    这个如果理解就好办了, 说明返回值是一个指针,那这个指针的类型是什么呢?就是void *[10],一个包含10个空指针的数组。
    如果变一下,
    int* (*fp2)( int)[ 10];  // 表示的什么?
    首先,fp2是一个函数指针,很好理解,然后是先与左边的*结合还是与右边的[10]结合呢?根据运算符优先级,[]高于*,因此
    函数的返回值是一个数组:int *[10], 而不一个指针。在C语言里面,数组是不能直接作返回值的,作为返回值的时候,必须转换成指针的,因此,这个语句会报错:
    error: Function cannot return array type " int *[10] "

    如果再变一下,加一个括号,
    int(* (*fp3)( int))[ 10];  // 表示的什么?
    首先,fp2是一个函数指针,很好理解,因为加了一个括号,所以函数的返回值是一个指针,那这个指针指向什么呢?
    指向int[10](包含10个整型数据的数组)。这样就没有问题的,因为函数的返回值是一个指针,指向一个数组。

    /*------------------------------------------------------------------------- * /
    void  (*funcPtr)();  //  这是一个函数指针,因为 (*funcPtr) 优先结合,表示这是一个指针
    void  *funcPtr();    //  这是一个指针函数 因为函数括号 () 优先级高于 * ,所以这是一个函数
    int   *a[ 10 ];        //  这是一个指针数组,因为 []  优先级高于 * ,所以这是一个数组
    int   (*a)[ 10 ];      //  这是一只数组指针 因为 () 优先级高级 [] ,所以这是一个指针
    /*------------------------------------------------------------------------- * /



    (2),  在新行情重构中,遇到了调用的一个函数signal(信号量),也比较晦涩,如下:
    void (*signal( int void  (*)( int )))( int );
    这是一个返回函数指针的函数。
    首先, signal按优先级先与函数()符号结合,那么它就是一个函数,
    然后,再与左侧的*结合,表示返回值是一个void(*)(int)类型。如果按下面这么写就容易理解了:
    typedef void(*PF)(int);
    PF signal(int, void (*)(int))
    更详细的返回函数指针的函数: http://blog.csdn.net/itianyi/article/details/42455953
    展开全文
  • C++函数指针、指针函数、返回值为函数指针的函数浅谈 引言 函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。 而返回值为函数指针的指针函数就更难理解了,放在文章的...

    C++函数指针、指针函数、返回值为函数指针的函数浅谈

    引言

    函数指针、指针函数是C中重要而容易混淆的概念,博主将通过两个实例来说明这两个截然不同的概念。
    而返回值为函数指针的指针函数就更难理解了,放在文章的最后来介绍。

    函数指针

    函数指针是一种特殊的 指针,它指向函数的入口。
    例如int (*add)(int, int);定义了一个函数指针add,用于指向返回值为int,并且有两个int参数的函数,下面用实例来说明

    /**
     * 作者:lyn
     * 时间:2018.10.30
     * 此程序用来演示函数指针
     */
    #include<iostream>
    using namespace std;
    
    int addfunc(int a, int b) {
            return a + b;
    }
    int main() {
            int (*add)(int, int) = addfunc;
            //两种方法都可以
            //int (*add)(int, int) = &addfunc;
    
            int result = (*add)(1, 2);
            //两种方法都可以,建议使用第一种
            //int result = add(1, 2);
            cout << "通过函数指针调用函数进行计算结果:" << result << endl;
            result = addfunc(1, 2);
            cout << "通过直接调用函数进行计算结果:" << result << endl;
            return 0;
    }
    

    在这里插入图片描述

    指针函数

    指针函数是一种返回值为指针的 函数
    例如A *createA();声明了一个返回值为指向A类型的指针的,参数列表为空的函数(这句话读起来可能有一··绕口),实例说明

    /**
     * 作者:lyn
     * 时间:2018.10.30
     * 该程序用来演示指针函数
     */
    #include<iostream>
    using namespace std;
    class A {
            public:
                    A(int a) {
                            this->a = a;
                    }
                    int getA(){
                            return a;
                    }
            private:
                    int a;
    };
    
    //返回值为指向类型A的指针的函数
    A *createA() {
            return new A(1);
    }
    
    int main(){
            //创建一个指向A类型的指针,并调用createA创建一个A类型的对象
            A* b = createA();
            //通过指针调用类的方法
            cout << "b->a = " << b->getA() << endl;
            return 0;
    }
    

    在这里插入图片描述

    返回值为函数指针的函数

    其实在搞懂了函数指针和指针函数后,这个概念并不难懂,其实这就是一个复杂一点的指针函数,因为他的返回值为函数指针。
    先给一个例子:

    /*
    *本例是SGISTL源码中的一个函数,比普通的返回值为函数指针的函数要更复杂一点
    *因为本例中函数的参数也是一个函数指针
    */
    void (* set_malloc_handler(void (*f)()))()
    

    我们把例子从里往外看
    void (*f)()是一个函数指针,它用于指向一个返回值为void,无参数列表的函数
    * set_malloc_handler(void (*f)())这是一个指针函数,返回值为指针,它有一个参数,参数为一个函数指针(返回值为void,无参数列表的函数)
    void (* set_malloc_handler(void (*f)()))()这是一个指针函数,返回值为函数指针(返回值为void,无参数列表的一个函数),它有一个参数,参数为一个函数指针

    展开全文
  • 如何定义返回函数指针的函数

    千次阅读 2012-08-14 10:49:24
    定义一个返回函数指针的函数,如果直接定义理解起来稍微有点困难。比如: extern void (*interruptf(int sig, void *func(int)))(int);定义了一个函数interruptf; 这个函数的参数有两个,分别是int型的sig和一个...
  • c语言函数指针_指针函数_返回值是函数指针

    千次阅读 多人点赞 2019-03-06 17:38:43
    函数指针作为函数的返回值 1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名 *函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”...
  • 定义返回函数指针的函数

    万次阅读 2009-10-10 17:39:00
    博学,切问,近思--詹子... 基础知识: 1) 定义函数指针:return_type (*func_pointer)(parameter_list)2) 定义返回函数指针的函数:return_type(*function(func_parameter_list))(parameter_list)定义了一个函数funct
  • 定义返回函数指针(地址)的函数

    千次阅读 2015-02-08 13:42:56
    其实函数指针和普通类型的指针没什么区别,只不过从代码的表现形式上略有差异罢了,回顾一下,下面定义两个在普通不过的”变量“,仔细推敲以下他们的区别。(插几句,现在所做的工作虽谈不上是科研,呵呵,和人家比...
  • 函数指针和指针函数用法和区别

    万次阅读 多人点赞 2018-05-24 08:11:10
    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,...
  • 一、返回指针函数  指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。 返回指针函数的一般形式为:类型名 * 函数名(参数列表)  比如下面这个函数返回一个指向char类型变量的...
  • 当C语言中子函数的返回值是一个指针(地址)时,我们将这个子函数称为指针函数 ...//因为子函数返回的是一个指针,所以子函数名称需要定义为指针格式char *strlong char *strlong(char *str1, c...
  • Java 中的“函数指针

    万次阅读 2018-02-13 12:07:10
    *且这个函数指针指向的函数必须是一个形式参数为char*类型,并且返回char*类型结果的函数 *也就是这里必须与我们想要使用的method1 和 method2函数原型保持一致 */ char * dataProcess( char * (*)( char *), ...
  • 函数指针的强制类型转换与void指针

    万次阅读 2018-06-21 11:36:28
    驱动库的作者为了使DVB芯片兼容尽可能多的tuner芯片,在定义tuner_init函数指针时,参数中的handle定义为(void* handle)。这样的话,这个handle既可以接收tuner1_handle ,也可以接收tuner2_handle。同时函数指针...
  • 问题(*(void(*)())0)();//何意? void (*signal(int,void(*)(int)))(int);//何意?idea 注意( )的优先级高于* [ ]的优先级也高于* 一旦我们知道了如何声明一个给定类型...函数返回值是函数指针的情况:void (*(f(int, c
  • 返回值为函数指针的函数

    千次阅读 2019-05-08 22:49:09
    函数指针:指向函数的指针 例如:void *p(int,int); //p是一个指针,可以指向一个返回值为void类型,参数为两个int类型的函数。 int *(*q)(char); //q是一个指针,指向一个返回值类型为int指针类型,参数为char...
  • 指针函数和函数指针

    万次阅读 多人点赞 2019-03-30 16:21:36
    很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针函数指针变量、函数指针数组放在一块的时候,能把强迫症的人活活逼疯。 其实如果理解了这些...
  • 返回函数指针的函数

    千次阅读 2015-01-06 11:08:38
    其前缀运算符星号“*”表示此函数指针函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回指针指向的类型”。
  • c++函数指针和返回值为指针的函数

    千次阅读 2017-04-13 21:34:42
    1 指针的指针,数组指针 ,指针数组 2 函数指针 指针函数  3 const T Tconst  T f ()const   const T f()
  • 其前缀运算符星号"*"表示此函数指针函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个"指向返回值为…的指针(地址),"类型名"表示函数返回指针指向的类...
  • 详解C语言指针函数、函数指针函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...
  • 函数能否返回函数指针

    千次阅读 2018-11-28 20:49:19
    我们大家都知道指针函数的返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象...
  • 函数指针(指向函数的指针) 与数据项类似,函数也有自己的地址。函数的地址是存储其机器代码的内存的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它。...
  • 函数指针函数指针类型

    千次阅读 2018-09-29 08:48:59
    函数指针 1. 定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。 注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址 2. 语法 指向函数的指针变量...
  • 一、指针函数 定义:指针函数是一种返回值为指针函数。 但是这么写很不清晰。 举例: A *createA();声明了一个返回值为指向A类型(即class A)的指针,参数列表为空的函数 #include<iostream> using namespace...
  • 这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B  C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下: [capture]...
  • 返回指针的函数(指针函数) 什么是返回指针的函数 ...注意函数指针和指针函数是不一样的概念 int (*p)(int,int);//这是是指向函数的指针(指针函数) 返回值为浮点类型,整数,字符 float aver...
  • 详解函数指针和类成员函数指针

    千次阅读 多人点赞 2017-11-12 21:35:56
    我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比从计算机原理的角度来理解更容易了。这里就简要回顾一下相关知识。 众所周知,计算机(图灵机)执行程序的基本流程就是:取指令->执行...
  • C++函数指针和回调函数

    千次阅读 2019-03-06 23:44:32
    什么是函数指针 函数指针就是指向函数的指针,指向某种特定的类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如: bool lengthCompare(const string &amp;amp;, const string &amp;...
  • 就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。 我先给你一个自定义数据类型的例子。 typedef int* PINT; //为int* 类型定义了一个PINT的别名 int main

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 866,586
精华内容 346,634
关键字:

返回函数指针

友情链接: Cap4.rar