考虑以下代码和输出:
#include <iostream>
int Add(int a, int b) {
return a + b;
}
int Subtract(int a, int b) {
return a - b;
}
int main() {
int (*fn1)(int, int);
int (*fn2)(int, int);
fn1 = &Add;
fn2 = &Subtract;
std::cout << "fn1 = " << fn1 << "\n";
std::cout << "*fn1 = " << *fn1 << "\n";
std::cout << "fn2 = " << fn2 << "\n";
std::cout << "*fn2 = " << *fn2 << "\n";
}
输出:
fn1 = 1
*fn1 = 1
fn2 = 1
*fn2 = 1
作为指针,我希望fn1
和fn2
成为内存地址,我真的不知道*fn1
和*fn2
会发生什么。根据{{3}},“函数指针指向内存中的可执行代码”,但我不知道“内存中的可执行代码”如何与“1”对应。
答案 0 :(得分:3)
*fn1
是一个函数左值,在大多数情况下,这样的值会衰减到指向该函数的指针,包括作为函数调用参数传递时。
你可以取消引用衰变的结果,以获得另一个函数左值,无限制:*****fn1
,***********fn1
等。
答案 1 :(得分:3)
功能指针是什么?
这取决于它是什么类型的函数指针。对于非成员函数指针(如在您的示例中),指针通常指向函数的实际代码(虽然在某些体系结构上,例如PowerPC,它可能指向一个特殊的“函数描述符”而不是):
要检查该值,您应该将其打印为void *
,而不是bool
(这是您在示例中所做的)。
std::cout << "fn1 = " << (void*)fn1 << std::endl;
另一种检查方法是使用调试器。例如,在GDB中:
(gdb) p/a fn1
(gdb) p/a fn2