函数指针本质上是一个指针变量,只不过这个变量保存的地址是一个函数的地址,那么直接调用函数和通过函数指针调用有没有区别呢?答案是有的,下面的代码是一个直接调用函数和通过指针调用函数的例子,使用gdb反汇编main函数可以发现,直接调用函数对应的汇编指令是call 函数地址,而通过指针调用函数时,首先将函数的地址赋值给一个通用寄存器,call指令通过这个寄存器跳转到对应的函数,相对于直接调用,指针调用有个中转的过程。
#include <stdio.h>void f()
{printf("hello %d\n", 1);
}int main(int argc, char **argv)
{f();void (*g)() = f;g();return 0;
}