[英]How come pointer to a function be called without dereferencing?
我在Py ++生成的C ++程序中有一个奇怪的typedef语句。
double radius(int); // function to be wrapped
typedef double (*radius_function_type)(int);
bp::def("radius", radius_function_type(&radius)); // bp::def is a function for wrapping
到目前为止,我发现上面的typedef状态不是我们大多数人都熟悉的类型,
typedef complex_type simple_alias;
相反,这是一种声明指向函数的指针的方法,该函数以int作为参数并返回double(与原型相同)。 所以我现在的问题是,如何以函数的地址作为参数来调用函数的指针(不进行解引用) ? 这也与原型不匹配。 有人请解释!
它没有声明函数指针变量,而是声明了名为radius_function_type
的函数指针typedef。 radius_function_type(&radius)
只是对函数指针本身的(冗余) radius_function_type(&radius)
。 (一元&
地址运算符也是多余的;对于一个函数, radius
和&radius
是相同的。)
在较低的级别上,调用函数只是根据基础调用约定(通常在堆栈上)将参数放在某个位置,然后跳转到内存地址。 因此,如果编译器知道函数指针类型(函数签名)和指针值本身,则可以仅使用指针来调用函数。
您的问题令人困惑。 您是否在问这是做什么的:
radius_function_type(&radius)"
这只是一个C ++类型转换,有点像:
radius (int (42));
但是由于radius已经是radius_function_type类型,因此您可以轻松地执行以下操作:
bp::def("radius", radius);
但是由于这是Py ++生成的代码,因此在输出时可能要格外小心。
好吧...有点类似于在C和C ++中数组与指针的关系。 函数的名称基本上也是指针。 从这个角度来看,给出一个定义并不奇怪:
int foo(int a, int b)
{
return a + b;
}
您可以直接通过函数名称的指针进行调用:
foo(1, 2);
或通过将该值存储在单独的变量中,该变量必须声明为指针:
int (*pointer)(int, int) = foo;
pointer(1, 2);
在这种情况下,我们可以直接通过指针变量进行调用,也不需要通过编写&foo
来显式地“获取”该函数的地址。
取消引用(按照您的想法)函数的指针意味着:访问CODE内存,因为它就像是DATA内存。
不能以这种方式取消对函数指针的引用。 相反,它被称为。
我将使用“取消引用”和“调用”的名称。 没关系。
无论如何:C的设计方式使得函数名称标识符以及变量保存函数的指针都具有相同的指向CODE存储器的地址。 并且它允许通过在标识符或变量上使用call()语法跳转到该内存。
函数指针基本上是需要调用的函数的地址。 要调用函数指针指向的函数,应将函数指针视为您要调用的函数的名称。 调用它本身的行为执行取消引用; 无需显式取消引用。
函数指针语法看起来像指针(带有&和*),也可以省略。 正如@unwind已经指出的那样,它类似于数组的处理方式,其中裸数组与指针相似,并且可以选择在数组前加上&来获取地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.