C 从函数返回函数指针并用指针调用它。这到底是怎么回事?

C 从函数返回函数指针并用指针调用它。这到底是怎么回事?,c,function,function-pointers,function-call,C,Function,Function Pointers,Function Call,以下面的代码为例,我在阅读一些关于函数指针的课堂讲稿时,遇到了这样一个问题: int(*转换(常量字符代码))(int,int){ if(code='+')return∑//接受两个整数,并相加 if(code='-')return&Difference;//取两个整数,然后进行减法运算 } int main(){ 内部(*ptr)(内部,内部); ptr=转换('+'); printf(“%d\n”,ptr(2,4)); } 在调用返回函数指针的函数时,我通常会看到这样的情况,对

以下面的代码为例,我在阅读一些关于函数指针的课堂讲稿时,遇到了这样一个问题:

int(*转换(常量字符代码))(int,int){
if(code='+')return∑//接受两个整数,并相加
if(code='-')return&Difference;//取两个整数,然后进行减法运算
} 
int main(){
内部(*ptr)(内部,内部);
ptr=转换('+');
printf(“%d\n”,ptr(2,4));
} 
在调用返回函数指针的函数时,我通常会看到这样的情况,对我来说,这是有意义的,因为这里列出了所有参数,
char
,以及两个
int

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

但从笔记上写的方式来看,我无法真正理解这里到底发生了什么。有人能告诉我这到底是怎么回事吗?它是否与分配函数的地址或其他什么有关?

要么是输入错误,要么是指函数名
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
}
[注意:请注意,由于函数指示符隐式转换为指向函数的指针,因此使用运算符
&
是多余的,例如

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('-');
AddSub('-')(5, 6);
您将获得指向
int(int,int)类型函数的指针类型表达式。
并且您可以再次向返回的指针提供参数,以调用指向的函数,如

AddSub('-');
AddSub('-')(5, 6);
为了更清楚,你可以像这样重写上面的表达式

( AddSub('-') )(5, 6);
它与此代码段相同

int ( *ptr )( int, int ) = AddSub(‘+’);
printf( “%d\n”, ptr(2,4));
但是没有中间变量
ptr

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

可能是输入错误,或者您指的是函数名
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
}
[注意:请注意,由于函数指示符隐式转换为指向函数的指针,因此使用运算符
&
是多余的,例如

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('-');
AddSub('-')(5, 6);
您将获得指向
int(int,int)类型函数的指针类型表达式。
并且您可以再次向返回的指针提供参数,以调用指向的函数,如

AddSub('-');
AddSub('-')(5, 6);
为了更清楚,你可以像这样重写上面的表达式

( AddSub('-') )(5, 6);
它与此代码段相同

int ( *ptr )( int, int ) = AddSub(‘+’);
printf( “%d\n”, ptr(2,4));
但是没有中间变量
ptr

printf( “%d\n”, AddSub( '+' )(2,4) );
有人能告诉我这到底是怎么回事吗?这和我的工作有关系吗 分配(*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));
}
有人能告诉我这到底是怎么回事吗?这和我的工作有关系吗 分配(*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));
}

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

#包括
#包括
typedef int func(int,int);
整数差(整数a,整数b){
返回a-b;
}
整数和(整数a,整数b){
返回a+b;
}
func*转换(常量字符代码){
if(code=='+')返回Sum;//取两个整数,并相加
if(code='-')返回差;//取两个整数,然后减去
} 
int main(){
func*ptr;
ptr=转换('+');
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));
} 

#包括
#包括
typedef int func(int,int);
整数差(整数a,整数b){
返回a-b;
}
整数和(整数a,整数b){
返回a+b;
}
func*转换(常量字符代码){
if(code=='+')返回Sum;//取两个整数,并相加
if(code='-')返回差;//取两个整数,然后减去
} 
int main(){
func*ptr;
ptr=转换('+');
printf(“%d\n”,ptr(2,4));
} 

这本该让你头疼的。没有什么不能用typedef修复的,这通常是您想要用函数指针类型来完成的。使用
typedef int(*转换器)(int left,int right)。现在它变得可读,而不是lisp:converter-Convert(const-char-code){…},这本该让您头疼的。没有什么不能用typedef修复的,这通常是您想要用函数指针类型来完成的。使用
typedef int(