C/C++中可以使用指针指向一段代码,这个指针就叫函数指针,假设有这样一段代码:
#include <stdio.h> int func(int a) { return a + 1; } void main() { int (*f)(int) = func; printf("%p\n", f); }
我们定义了一个函数func,然后使用指针变量f指向该函数,然后打印出变量f指向的地址,代码很简单,然后我们编译一下,看下编译后生成的指令,我们重点关注func函数:
0000000000400526 <func>: 400526: 55 push %rbp 400527: 48 89 e5 mov %rsp,%rbp 40052a: 89 7d fc mov %edi,-0x4(%rbp) 40052d: 8b 45 fc mov -0x4(%rbp),%eax 400530: 83 c0 01 add $0x1,%eax 400533: 5d pop %rbp 400534: c3 retq
可以看到,编译好后的函数func位于地址0x400526这个地址,让我们记住这个地址。
然后运行一下编译后生成的程序,想一想这段代码会输出什么呢?
显然应该是func函数的在内存中的地址!
$ ./a.out 0x400526
没有猜错吧&