关于函数指针的问题
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):注意红体字部分
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)
Int
val;
将其定义为无符号整型:
unsigned
val;
将其定义为整型指针:
int*
val;
将其定义为空指针:
void*
val;
将其定义为类型“void(*)(int)”的函数指针:
void (*val)(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);
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):int32typedef 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);
相关文章推荐
- 关于指针函数和函数指针的问题(一)
- <C语言>关于函数返回值是指针,取不到值的问题研究
- 从一段经典错误代码说起——关于局部变量指针和函数传参的问题分析
- 关于数组做函数形参和指针做函数形参的问题
- 关于c++ 函数指针的问题
- 关于类成员函数指针的调用问题
- 关于函数返回值是指针的问题
- 关于类的静态成员函数指针的问题
- 关于指针结构体函数中指针变量的赋值&的问题思路
- ads中关于函数指针转换的很奇怪的问题
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 关于指针数组、数组指针、指针函数、函数指针等的问题
- 关于用函数指针参数申请动态内存的问题
- 关于函数返回值为引用和指针的问题
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- 关于函数返回值是指针的问题
- 关于函数字符数组调用的问题(没有搞清指针的概念)
- 关于函数里对指针赋值的问题
- 关于使用equals()函数报 空指针 的错误问题
- 关于局部指针变量 函数调用后 该指针的问题