1、 函数指针
(1)函数指针申明如下:
float (*my_func_ptr)(int, char *);
// 为了更好地理解,强烈建议使用typedef声明.
// 当函数指针是一个函数的参数时,容易造成混淆.
//声明应该是
typedef float (*MyFuncPtrType)(int, char *);
MyFuncPtrType my_func_ptr;
注:1) 函数指针参数组合不同,则函数指针类型也是不同的。2)函数调用约定(
__cdecl
,
__stdcall
, and
__fastcall
)
不同,函数指针类型也是不同的。
(2)函数指针my_func_ptr指向函数float some_func(int, char*) :
my_func_ptr = some_func;
(3)使用函数指针调用存储的函数 :
(*my_func_ptr)(7, "Arbitrary String");
(4)特性:
1)不同类型函数指针之间可以互相转换,但是函数指针不能转换为一个void*类型的数据指针。
2)函数指针能被赋值为0,以表示为一个空指针。
3)全范围的比较操作(==
, !=
, <
, >
, <=
, >=
)适用于函数指针,通过使用"== 0"或者隐式转换为bool类型来测试函数指针是否为空指针。
4)函数指针能够作为一个非类型模板参数,这与类型模板参数有根本性区别,也和整型非类型参数不同,它是基于名字而不是类型或者值来实例化的。(这个不是所有编译器支持)
(5)总结:
1)函数指针应用有:库函数qsort的参数,Windows回调函数等等。
2)函数指针仅仅是"code pointers",它表示一段汇编程序的开始地址。
3)不同类型函数指针存在的意义仅仅是为了确保使用了正确的调用约定。