关于指向函数的指针的纳闷

关于指向函数的指针的疑惑

示例程序如下:

#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