什么是功能指针敲打

What are Function Pointers Ponting To?

本文关键字:指针 功能 什么      更新时间:2023-10-16

考虑以下代码和输出:

#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的期望。根据Wikipedia的说法,"功能指针指向内存中可执行代码",但我看不出"内存中可执行代码"中的" 1"。

*fn1是一个函数lvalue,这种值在大多数情况下衰减了指向该功能的指针,包括当以函数呼叫参数为单位时。

您可以消除衰减的结果,以获取另一个功能lvalue,ad infinitum: *****fn1***********fn1等。

什么是函数指针敲打?

这取决于它是哪种功能指针。对于非会员函数指针(如示例中),指针通常指向该函数的实际代码(尽管在某些架构(例如PowerPC)上,它可能指向一个特殊的"函数描述符"):

要检查该值,您应该将其打印为void *,而不是bool(这是您在示例中所做的)。

std::cout << "fn1 = " << (void*)fn1 << std::endl;

检查它的另一种方法是使用调试器。例如,在GDB中:

(gdb) p/a fn1
(gdb) p/a fn2