关于函数指针和函数声明一个小问题,如下:
今天看到一个语句:
(*(void (*)())0) ();
这样的表达式看着确实很难理解,但是,这类表达式其实是按照使用的方式来声明的。
任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符。
例如下面这个声明:
float (*h) ();
h是一个返回值为浮点类型的函数的指针,所以h是一个函数指针,*h表示的是它所指向的函数。
把最上面的那个语句可以看成是:
(* fp) ();
fp = ((void (*)())0);
注意,(void (*)())0,这个表达式是对0进行强制转换,转换完成后,0变成了一个指向返回值为void的函数的指针。
所以,这个语句是,一个指向返回值为空的函数的“指向返回值为void的函数的”指针