#include <stdio.h>
#include <stdlib.h>
int add(int a, int b){
return a+b;
}
int main()
{
int (*fn)(int, int)=add;
if ( *fn == &add)
puts("*fn == &add\n");
if ( *fn == add)
puts("*fn == add\n");
if ( &fn != add)
puts("&fn != add\n");
if ( &fn == *add)
puts("&fn == *add\n");
else
printf("\n fn=%p, &fn=%p, *fn=%p,\nadd=%p, &add=%p, *add=%p\n",
fn, &fn, *fn, add, &add, *add);
system("pause");
printf("\n 1+2=%d //(&(***(&add)))(1,2)\n", (&(***(&add)))(1,2)); //搞笑而合法的语法1
printf("\n fn(1,2)=%d //(&(***fn))(1,2)\n", (&(***fn))(1,2)); //合法2
system("pause");
return 0;
}
结论:
1.函数名(代表函数对象)在表达式中, 会转化为函数入口地址(函数指针)
(这种行为与数组对象相似)
(并且也在&运算时例外, 这时它就是函数对象, 因此&运算得到其入口地址)
2.对函数入口地址, 进行*运算, 得到函数对象;
3.对函数入口地址, 不可以进行&运算, 因为它是右值
最终, 是使用 函数入口地址(实参列表) 的形式, 进行函数调用