功能指针是什么?

时间:2017-02-19 16:56:47

标签: c++ pointers

考虑以下代码和输出:

#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

作为指针,我希望fn1fn2成为内存地址,我真的不知道*fn1*fn2会发生什么。根据{{​​3}},“函数指针指向内存中的可执行代码”,但我不知道“内存中的可执行代码”如何与“1”对应。

2 个答案:

答案 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