函数的指针
来源:互联网 发布:iphone照片 mac导入 少 编辑:程序博客网 时间:2024/05/16 05:08
定义
函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型(特定的函数类型)。函数类型由其返回类型以及形参表确定,而与函数名无关。如下声明了一个函数指针:
bool (*pFunc)(int, double);
这个语句将pFunc声明为指向函数的指针,它所指向的函数带有两个类型分别为int和double的形参及一个 bool 类型的返回值。
说明:*pFunc 两侧的圆括号是必需的,否则它就变成了函数的声明,如:bool *pFunc(int, double);表示pFunc是一个带有两个参数(int和double)和一个bool指针类型返回值的函数。
总结,函数指针声明的一搬形式:
T (*pFunc)(T args);
pFunc为函数指针,T为数据类型,参数(T args)可以有多个,也可以没有。
【例1】:
bool IsAdult(int age, double weight){if (age > 18 || weight > 40.0){return true;}return false;}void TestFuncPointer(){bool (*pFunc)(int, double);pFunc = IsAdult;cout << pFunc(12, 23) << endl;}
结果:
0
用typedef简化声明
我们知道typedef可以给类型定义一个别名,函数指针本身就是一种类型,所以也可以给其定义一个别名简化基声明。如下:
typedef bool (*FuncPointer)(int, double);
该定义表示 FuncPointer是一种函数指针类型的名字。该指针类型为“指向返回 bool 类型并带有两个(int和double)引用形参的函数的指针”。则【例1】中的使用简化为如下:
【例2】:
bool IsAdult(int age, double weight){if (age > 18 || weight > 40.0){return true;}return false;}typedef bool (*FuncPointer)(int, double);void TestFuncPointer(){FuncPointer pFunc = IsAdult;cout << pFunc(12, 23) << endl;}
这样,如果有多个地方使用同种类型的函数指针的话,定义指向函数的指针就会简单很多。
用typedef定义函数指针的一般形式如下:
typedef T (*FuncPtrType)(T args);
FuncPtrType pFunc = NULL;
FuncPtrType为这一函数指针类型的别名,T为数据类型,参数(T args)可以有多个,也可以没有;pFunc为函数指针。
初始化和赋值
在【例1】和【例2】中已经提到了函数指针的使用。在给函数指针赋值时,直接引用函数名等效于在函数名上应用取地址操作符,都是把函数的地址赋给函数指针变量。
bool IsAdult(int age, double weight){if (age > 18 || weight > 40.0){return true;}return false;}bool isIntBiger(int val1, double val2){return val1 > val2;}int GetMax(int val1, int val2){return val1 > val2 ? val1 : val2;}typedef bool (*FuncPointer)(int, double);void TestFuncPointer(){FuncPointer pf1 = 0;// 初始化为0(即空指针),表示该指针不指向任何函数FuncPointer pf2 = IsAdult;// 用函数名初始化函数指针FuncPointer pf3 = isIntBiger;// IsAdult和isIntBiger参数和返回类型都相同,所以属于相同类型的函数pf1 = IsAdult;// 用函数名赋值pf1 = pf3;// 用函数指针赋值cout << pf1(13, 15) << endl;cout << pf2(13, 56) << endl;cout << pf3(18, 15) << endl;//FuncPointer pf4 = GetMax;// error,GetMax不是属于FuncPointer类型的函数,因为参数类型和返回值的类型都不同}
结果:
0
1
1
函数指针作为函数参数
函数指针还可以作为别一个函数的形参。这种形参可以用以下三种形式中的任何一种编写:
void printBiger(int, int, int (int, int));//等价于void printBiger(int, int, int func(int, int));
void printBiger(int, int, int(*func)(int, int));//等价于void printBiger(int, int, int(*func)(int, int));
void printBiger(int, int, FuncPointerMax);//还可以用简化的形式
【例3】:
int GetMax(int val1, int val2){return val1 > val2 ? val1 : val2;}typedef int (*FuncPointerMax)(int, int);void printBiger(int val1, int val2, int func(int, int)){cout << func(val1, val2) << endl;}void TestFuncPointer(){FuncPointerMax pFuc = GetMax;printBiger(5, 10, pFuc);}
函数指针作为函数的返回值
函数指针还可以作为函数的返回值类型,其写法比较复杂,例如:
int (*func(int))(int*, int);
要理解这个函数指针的声明,最佳的方法是从声明的名字开始由里而外理解。func(int) 将func声明为一个函数,它带有一个int型的形参,该函数返回一个函数指针,函数指针的类型为:
int (*)(int*, int);
是不很难理解?那有没有易于理解的写法呢?答案是肯定的,我们同样可以用typedef 进行简化,如下:
typedef int (*FuncPointer)(int*, int);
FuncPointer func(int);
欢迎加入"C/C++梦之队" 学习群:226157456
- 指针函数 函数的指针
- 函数指针,函数指针数组,函数指针数组的指针
- 函数指针,函数指针数组,函数指针数组的指针
- 函数指针,指针函数,指针的指针做函数参数
- 函数指针,函数指针数组,函数指针数组的指针
- 函数指针、函数指针数组,函数指针数组的指针
- 指针函数、函数指针、返回函数指针的函数
- 函数,指针与函数的关系,函数指针,指针函数
- 指针函数、数组指针、函数指针、函数指针数组和指向函数指针数组的指针
- 函数指针数组的指针
- 函数形参中指针的指针
- 函数指针数组的指针
- 指针数组、数组指针、指针函数、函数指针的区别
- 函数指针和指针函数 指针的指针
- 对函数指针,指针函数和指针的指针理解。
- 指针函数,函数指针,指针的指针 详解
- 指针数组 数组指针 指针函数 函数指针的区别
- 指针,指针函数,指针数组的区别
- ANDROID 实现选择文件对话框
- uva 10651(dp + 哈希)
- c#表达式树Expression简单类型比较demo
- 《cocos2d-x游戏开发之旅》学习笔记(二)
- 第8周项目5:定期存款利息计算器
- 函数的指针
- C# WebBrowser控件禁用超链接转向、脚本错误提示、默认右键菜单和快捷键
- java 深入分析ClassLoader工作机制
- Cisco笔试——2014年
- 将Spring源码导入Spring Tool Suite/Eclipse
- c#动态构建代码树
- Ubuntu-Python2.7安装 scipy,numpy,matplotlib
- 第十周上机项目五
- 搭建mysql主从集群的步骤