参考:http://hi.baidu.com/momowumen/item/f0c6b5dfedd8d110d80e4403
void (*signal(int _sig, void(*_func)(int)))(int); 函数解析
part 1:1)什么是函数指针?2)如何声明一个函数指针?3)如何将一个地址强制转换为某一个类型的函数指针呢?
1)指向函数的指针就是函数指针
例子:
void function(int a)
{
a = 5;
}
void (*pfunc)(int);
很简单,上面这段代码声明了一个函数fucntion和一个函数指针pfunc, 它指向的函数就是一个具有void返回值,int参数的函数。如果将function函数的地址给pfunc指针,可以简单的通过下面两种赋值:
pfunc = function;
或者
pfunc = &function;
通过指针调用该函数,也有两种方法:
pfunc(5); 或 (*pfunc)(5);
我们看一下赋值语句,pfunc = function;
3)但有时候可能是一个常数0x8999940, 它恰好也表示一个安全的与function相同的函数,如何将这个数值赋给pfunc呢?显然我们需要强制类型转换,应该将该常数转换成什么类型呢?这就是问题的关键!
提取转换类型的方法:在void (*pfunc)(int)语句里面,只有pfunc是变量名称,那么剩余的部分,void(*)(int),就是我们需要的转换类型。
因此,新的赋值pfunc = (void (*)(int)) 0x8999940;
赋值完成后,就可以通过pfunc(5); 或 (*pfunc)(5);调用相应的函数了。
part 2:返回函数指针的函数声明:根据下面所给数据自己总结(本人表达能力太弱,心里明白但说不出,只能这样了:-D):注意红体字部分
重定义数据类型
重定义一整型数据类型(int):int32
typedef int int32
重定义一无符号整型数据类型(unsigned int):u_int32
typedef unsigned int u_int32
重定义一整型指针数据类型(int*):p_int
typedef int* p_int
重定义一空指针数据类型(void*):p_null
typedef void* p_null
重定义一函数指针数据类型(void (*)(int)):handler
typedef void (*handler) (int)
变量名为:val
将其定义为整型:
Int val;
将其定义为无符号整型:
unsigned val;
将其定义为整型指针:
int* val;
将其定义为空指针:
void* val;
将其定义为类型“void(*)(int)”的函数指针:
void (*val)(int);
有一函数,函数名为signal,第一个参数为整型(int)_sig,第二个参数为类型为(void (*)(int))的函数指针_func:signal(int _sig, void (*_func)(int))
若该函数无返回值,其定义形式为:
void signal(int _sig, void(*_func)(int));
若该函数返回值是整型,其定义形式为:
int signal(int _sig, void(*_func)(int));
若该函数返回值是整型指针,其定义形式为:
Int* signal(int _sig, void(*_func)(int));
若该函数返回值是类型为(void(*)(int))的函数指针,其定义形式为:
void(*signal(int_sig, void (*_func)(int)))(int);