关于指向函数的指针的疑惑
示例程序如下:
#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
如果我的眼睛没看花的话,汇编代码都是一样的
编译器就这么解释的,只能理解成函数指针具有特殊性,不能与一般变量一样理解,告一段落吧
如果哪位读者有可靠的、较好的解释,烦请共享!!!