编写了以下程序:
但是搞不明白为什么改变语句:
c=(*p)(a,b);为c=(p)(a,b);
程序同样可以运行,且运行正确;
同时想问一下调试时,两个变量分别表达什么意思?
p是函数的入口地址
其中的内容就是其本身
所以加不加星号无所谓
好比
int * p;
p =(int *)&p;
这里p的值是p的地址
11: c=(*p)(a,b);
0040FA34 mov esi,esp
0040FA36 mov edx,dword ptr [ebp-0Ch]
0040FA39 push edx
0040FA3A mov eax,dword ptr [ebp-8]
0040FA3D push eax
0040FA3E call dword ptr [ebp-4]
0040FA41 add esp,8
0040FA44 cmp esi,esp
0040FA46 call __chkesp (0040f8e0)
0040FA4B mov dword ptr [ebp-10h],eax
12: printf("a = %d,b = %d,max = %d\n",a,b,c);
0040FA4E mov ecx,dword ptr [ebp-10h]
0040FA51 push ecx
0040FA52 mov edx,dword ptr [ebp-0Ch]
0040FA55 push edx
0040FA56 mov eax,dword ptr [ebp-8]
0040FA59 push eax
0040FA5A push offset string "a = %d,b = %d,max = %d\n" (00422e80)
0040FA5F call printf (0040f980)
0040FA64 add esp,10h
13: c=(p)(a,b);
0040FA67 mov esi,esp
0040FA69 mov ecx,dword ptr [ebp-0Ch]
0040FA6C push ecx
0040FA6D mov edx,dword ptr [ebp-8]
0040FA70 push edx
0040FA71 call dword ptr [ebp-4]
0040FA74 add esp,8
0040FA77 cmp esi,esp
0040FA79 call __chkesp (0040f8e0)
0040FA7E mov dword ptr [ebp-10h],eax
14: printf("a = %d,b = %d,max = %d\n",a,b,c);
0040FA81 mov eax,dword ptr [ebp-10h]
0040FA84 push eax
0040FA85 mov ecx,dword ptr [ebp-0Ch]
0040FA88 push ecx
0040FA89 mov edx,dword ptr [ebp-8]
0040FA8C push edx
0040FA8D push offset string "a = %d,b = %d,max = %d\n" (00422e80)
0040FA92 call printf (0040f980)
0040FA97 add esp,10h
两者对应的汇编一致,说明编译器解释应该是一致的吧