先看看类型转换符:
如声明float (* h) ( ) ;表示h是一个指向返回值为浮点类型的函数的指针,因此: (float ( * ) ( ) )表示一个“指向返回值为浮点类型的函数的指针”的类型转换符。
(* (void ( * )( ) 0 ) ( );表示什么呢?
很简单的可以看出 (void ( * )( ) 表示一个类型转换符,那么(void ( * )( )0,就是把地址0转换为一个函数指针类型,“指向返回值为void类型的函数的指针”,我们用fp替代一下(void ( * )( )0,得到(* fp )( )。这是对一个函数的调用。
可以简单地看看(* fp )( ); 因为fp是一个函数指针,那么*fp就是该指针所指向的函数,所以(*fp ) ( )就是调用该函数的方式。ansi c标准允许简写为fp( ),但这仅仅是一种简写。
注意:如果写成*fp();那么*fp()实际上与*(fp() )的含义完全一样,ansi c把它作为* ((* fp) ( ) )的简写。
如果fp是一个指向返回值为void类型的函数指针,那么:
void (*fp) ( );
因此,将常数0转换为“指向返回值为void的函数的指针”的类型,可以这样写:(void ( * ) ( ) ) 0
因此可以用(void ( * ) ( ) ) 0 来代替fp,从而得到(* (void ( * )( ) 0 ) ( );表示调用存储位置为0的子函数。