您的位置:首页 > 编程语言 > C语言/C++

关于函数指针的问题

2013-12-31 18:54 246 查看
参考: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);
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息