关于指向函数的指针的纳闷
示例程序如下:
#include<stdio.h> int add(int a,int b) { return a+b; } void main() { int add(int,int); int a=3,b=4,c; int (*p)(int,int); p=&add;//这里改成p=add不影响结果 c=(*p)(a,b);//这里改成c=p(a,b)不影响结果 printf("%d",c); }
逻辑上上述改动应该会是不同结果才对,无奈之下汇编测试
11: p=&add;
00401076 mov dword ptr [ebp-10h],offset @ILT+0(_add) (00401005)
11: p=add;
00401076 mov dword ptr [ebp-10h],offset @ILT+0(_add) (00401005)
12: c=(*p)(a,b);
0040107D mov esi,esp
0040107F mov eax,dword ptr [ebp-8]
00401082 push eax
00401083 mov ecx,dword ptr [ebp-4]
00401086 push ecx
00401087 call dword ptr [ebp-10h]
0040108A add esp,8
0040108D cmp esi,esp
0040108F call __chkesp (00401160)
00401094 mov dword ptr [ebp-0Ch],eax
12: c=p(a,b);
0040107D mov esi,esp
0040107F mov eax,dword ptr [ebp-8]
00401082 push eax
00401083 mov ecx,dword ptr [ebp-4]
00401086 push ecx
00401087 call dword ptr [ebp-10h]
0040108A add esp,8
0040108D cmp esi,esp
0040108F call __chkesp (00401160)
00401094 mov dword ptr [ebp-0Ch],eax
如果我的眼睛没看花的话,汇编代码都是一样的
编译器就这么解释的,只能理解成函数指针具有特殊性,不能与一般变量一样理解,告一段落吧
如果哪位读者有可靠的、较好的解释,烦请共享!!!
- 1楼t565022817昨天 09:46
- 函数名可以看作一个指向代码段首指令的常量指针。
- Re: goodcat12昨天 10:04
- 函数名是一个指针常量,它是占用内存的,add是常量名的话那&add应该是存放这个指针常量的地址,即本质是一个指向指针的指针回复t565022817