详解C/C++函数指针声明 ( *( void(*)())0)();

 ( *( void(*)())0)();

float
*pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针。 float *g() , (*h)(); 表示*g()与(*h)()是浮点表达式。因为()结合优先级高于*,*g()也就是*(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。同理,可以得出h是一个函数指针,h所指向函数的返回值为浮点类型。 float (*h)(); 表示h是一个指向返回值为浮点类型的函数的指针,因此, (float (*)()) 表示一个“指向返回值为浮点类型的函数的指针”的类型转换符。 第一步,假定变量fp是一个函数指针,那么如何调用fp所指向的函数呢?调用方法如下:(*fp)(); 因为fp是一个函数指针,那么*fp就是该指针所指向的函数,所以(*fp)()就是调用该函数的方式。 表达式(*fp)()中,*fp两侧的括号非常重要,因为函数运算符()的优先级高于单目运算符*。如果*fp两侧没有括号,那么*fp()实际上与*(fp())的含义完全一致。 (*0)() 上式并不能生效,因为运算符*必须要一个指针来做操作数。而且这个指针还应该是一个函数指针,这样经运算符*作用后的结果才能作为函数被调用。因此,在上式中必须对0作类型转换,转换后的类型可以大致描述为:“指向返回值为void类型的函数的指针”。 因此,将常数0转型为“指向返回值为void的函数的指针”类型,可以这样写: (void (*)())0 当然,我们用typedef来解决这个问题能够表述更加清晰: 1 2 typedef void (*fp)();//声明一个函数指针类型fp (*(fp)0)();//对0转换为函数指针类型,*(函数指针)就是函数本身,
原文地址:https://www.cnblogs.com/yaowen/p/4797354.html