先解释void (*func)(int):
void func()->void func(int)->void *func(int)->void (*func)(int)
上面的图示能看明白吧?func是一个函数指针,它的返回类型为空,它所指向的函数接收一个int型的参数。若是写成void *func(int)则变成了:func是一个函数,它的返回类型是空指针,它接受一个int型参数。
所以void (*signal(int sinno,void(*func)(int)))(int)意思是:
signal是一个函数指针,它的返回类型是void,它接收一个int类型的参数;不过这个指针是另一个函数的返回值,它接收2个参数,第一个是int,第二个已经解释过了。
UNIX下有个工具CDECL,可以自动翻译这种声明,你可以让它翻译下看看,和我说的是不是一致。我刚才在我的虚拟机里试了下,发现没有这个程序。所以没有验证。
void (*func)(int)
-----------------------
这种形式是“函数指针”。
原则是:
(1)第一:首先要有一个函数的基本形式。返回类型 ()(函数参数列表)
(2)第二:就是(1)中的括号部分。表示一个指向函数名称的指针。所以用*声明。*一定要在指针名的前面。
就是这两个原则就行了。
首先分析void(*func)(int))这是一个函数指针,你可以用typedef 定义一个新类型:
typedef void(*T)(int))
此时新类型T便代替了前面的函数指针,然后:
void (*signal (int sinno,T))(int)
这样看就明白一些了,函数指针T作为函数signal的形参,同样函数signal也是一个函数指针,最后的int是函数指针signal所指向的函数的参数,一个整形的参数。
int 应该是指参数的类型吧,这个应该是在函数申明的时候这么写的吧。而且我觉得这样写函数的用意也就在于把读程序的人给整晕吧~~~
(int)就是参数表啊,和(int n)之类一样,只是没为参数制定名字,所以在函数中无法使用参数而已