从函数返回函数指针并用指针调用它。这究竟是如何工作的?
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));
}
所以采用以下代码,我正在阅读一些关于函数指针的讲义,我遇到了这个:
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 运算符 ()
.
如果以这种等效的方式重写,使用 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));
}