从函数返回函数指针并用指针调用它。这究竟是如何工作的?

Returning a Function Pointer from a Function and Calling it with a Pointer. How does this Work Exactly?

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

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));
} 

我通常习惯于在调用一个 returns 函数指针的函数时看到类似的东西,对我来说,这是有道理的,因为我在这里列出了所有参数, char,以及两个 int 的:

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

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

可能是打错了,或者您指的是函数名称 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);

与此代码段相同

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

但没有中间变量ptr

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

Can someone tell how exactly does this work? Does it have to do with assigning (*ptr)(int, int) the function's address or something?

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

调用 pointed-to 函数

如果以这种等效的方式重写,使用 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));
}

指向函数的指针保留对函数的引用并可以被调用,但它们的行为与其他指针完全相同。语法让很多人感到困惑,这是将指针隐藏在 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));
}