【问题标题】:Returning a Function Pointer from a Function and Calling it with a Pointer. How does this Work Exactly?从函数返回函数指针并用指针调用它。这是如何工作的?
【发布时间】:2021-01-20 18:47:21
【问题描述】:

所以拿下面的代码,我正在阅读一些关于函数指针的讲义,我遇到了这个:

int (*Convert(const char code))(int, int) {
    if (code == ‘+’) return ∑ // Takes two ints, and adds
    if (code == ‘-’) return &Difference; // Takes two ints, and subtracts
} 

int main () {
    int (*ptr)(int,int);
    ptr = Convert(‘+’);
    printf( “%d\n”, ptr(2,4));
} 

我通常习惯于在调用返回函数指针的函数时看到类似的内容,对我来说,这是有道理的,因为我在这里列出了所有参数,char 和两个 @987654323 @的:

Convert('-')(5, 6);

但是按照笔记中的写法,我无法真正理解这里到底发生了什么。有人能说出这到底是如何工作的吗?它与分配(*ptr)(int, int)函数的地址有关吗?

【问题讨论】:

  • 这应该让你头疼。没有什么是不能用 typedef 修复的,总是你想用函数指针类型做的事情。使用typedef int (*converter)(int left, int right);。现在它变得可读而不是 lisp:converter Convert(const char code) {...}

标签: c function function-pointers function-call


【解决方案1】:

有人能说出这到底是如何工作的吗?有没有关系 分配 (*ptr)(int, int) 函数的地址还是什么?

函数Convert()返回一个指向函数的指针——一个指向Sum()的指针或一个指向Difference()的指针,取决于它的参数(或者它在没有指定返回值的情况下终止,这对你来说是个坏消息如果你对返回值做了任何事情)。该函数指针存储在变量ptr 中,该变量被声明为与Convert() 返回的类型相同。然后可以使用函数调用运算符() 调用指向的函数。

如果以这种等效的方式重写,使用typedef,也许会更清楚一点:

typedef int (*op_function)(int, int);

op_function Convert(const char code) {
    if (code == ‘+’) return ∑ // Takes two ints, and adds
    if (code == ‘-’) return &Difference; // Takes two ints, and subtracts
} 

int main () {
    op_function ptr;
    ptr = Convert(‘+’);
    printf( “%d\n”, ptr(2,4));
}

【讨论】:

    【解决方案2】:

    要么有错字,要么你的意思是函数名 AddSub 而不是 Convert

    例如

    int (*AddSub(const char code))(int, int) {
        if (code == ‘+’) return ∑ // Takes two ints, and adds
        if (code == ‘-’) return &Difference; // Takes two ints, and subtracts
    }
    

    [注意:使用运算符&是多余的,因为函数指示符隐式转换为指向函数的指针,例如

    int (*AddSub(const char code))(int, int) {
        if (code == ‘+’) return Sum; // Takes two ints, and adds
        if (code == ‘-’) return Difference; // Takes two ints, and subtracts
    }
    

    -结束注释。]

    所以像这样调用函数

    AddSub('-');
    

    你会得到一个类型指针的表达式,指向int( int, int ).类型的函数,你可以再次为返回的指针提供参数来调用指向的函数,比如

    AddSub('-')(5, 6);
    

    为了更清楚,你可以重写上面的表达式

    ( AddSub('-') )(5, 6);
    

    和这段代码sn-p一样

    int ( *ptr )( int, int ) = AddSub(‘+’);
    printf( “%d\n”, ptr(2,4));
    

    但没有中间变量ptr

    printf( “%d\n”, AddSub( '+' )(2,4) );
    

    【讨论】:

      【解决方案3】:

      指向函数的指针保持对该函数的引用并且可以被调用,但它们的行为与其他指针完全相同。语法让很多人感到困惑,这是在 typedef 后面隐藏指针有意义但没有必要的地方之一

      #include <stdio.h>
      #include <stdlib.h>
      
      typedef int func(int, int);
      
      int Difference(int a, int b){
          return a - b;
      }
      
      int Sum(int a, int b){
          return a + b;
      }
      
      func *Convert(const char code) {
          if (code == '+') return Sum; // Takes two ints, and adds
          if (code == '-') return Difference; // Takes two ints, and subtracts
      } 
      
      int main () {
          func *ptr;
          ptr = Convert('+');
          printf( "%d\n", ptr(2,4));
      } 
      
      

      【讨论】:

        猜你喜欢
        • 2017-03-25
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 2013-04-10
        相关资源
        最近更新 更多