博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数指针
阅读量:2385 次
发布时间:2019-05-10

本文共 6532 字,大约阅读时间需要 21 分钟。

什么是函数指针?
函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。
 
一个具体函数的名字,如果后面不跟调用符号(即括号),则该名字就是该函数的指针(注意:大部分情况下,可以这么认为,但这种说法并不很严格)。
 
函数指针的声明方法
// 定义函数指针pf
int (*pf)(const int&, const int&);                     (1)
上面的pf就是一个函数指针,指向所有返回类型为int,并带有两个const int&参数的函数。注意*pf两边的括号是必须的,否则上面的定义就变成了:
int *pf(const int&, const int&);                                           (2)
而这声明了一个函数pf,其返回类型为int *, 带有两个const int&参数。
 
用typedef定义函数指针类型
// 定义函数指针类型cmpFuntypedef int (*cmpFun)(const int&, const int&);                      (3)
这样,cmpFun就成了一种数据类型,可以用它来声明和定义形如(1)式中的pf那样的函数指针,比如:
cmpFun pf = 0;cmpFun pf = someFunction;
 
举个例子来说明一下:
#include 
#include
using namespace std; // 定义函数指针pfint (*pf)(const int&, const int&); // 定义函数指针类型cmpFuntypedef int (*cmpFun)(const int&, const int&); // 具体函数int intCompare(const int& aInt, const int& bInt){ if(aInt == bInt) return 0; if(aInt > bInt) { return 1; } else { return -1; }} int main(void){ int aInt = 1; int bInt = 2; pf = intCompare; // pf = &stringCompare; // 和上面一句是完全一样的 // 使用pf if(pf(aInt, bInt) == 0) { cout << "two integers are equal" << "." << endl; } else if(pf(aInt, bInt) > 0) { cout << aInt << " is greater than " << bInt << "." << endl; } else { cout << aInt << " is less than " << bInt << "." << endl; } cout << "------------------------" << endl; // 用函数指针类型cmpFun声明并初始化一个函数指针pf2 cmpFun pf2 = intCompare; // 使用pf2 if(pf2(aInt, bInt) == 0) { cout << "two integers are equal" << "." << endl; } else if(pf(aInt, bInt) > 0) { cout << aInt << " is greater than " << bInt << "." << endl; } else { cout << aInt << " is less than " << bInt << "." << endl; } return 0;}
 
 
函数指针作为参数
函数指针可以作为一个函数的参数,如下两种办法可以做到这一点:
(a) int plusFun(int&, int&, int (const int&, const int&));
(b) int plusFun(int&, int(*)(const int&, const int&));
以上两个方式做到的是类似的事情:(a)中的plusFun函数的第三个参数就是一个函数指针, (b)中的第二个参数也是一个函数指针。下面我们分别定义前面声明的两个plusFun函数。
(a)中的plusFun定义如下:
//函数指针作为参数:错误的做法//int plusFun(int& aInt, int& bInt, int paf(const int& cInt, const int& dInt))//{////       return aInt + bInt + paf(cInt, dInt);//} //函数指针作为参数:正确的做法int plusFun(int& aInt, int& bInt, int paf(const int &, const int &)){         int cInt = 2;         int dInt = 1;         return aInt + bInt + paf(cInt, dInt);}
 
调用plusFun的代码:
…pf = intCompare;…// 函数指针作为参数int aaInt = 3;int bbInt = 4;cout << plusFun(aaInt, bbInt, pf) << endl;
 
(b)中的plusFun定义如下:
//函数指针作为参数:错误的做法//int plusFun(int& aInt, int(*paf2)(const int& bInt, const int& cInt))//{//       return aInt + paf2(bInt, cInt);//} //函数指针作为参数:正确的做法int plusFun(int& aInt, int(*paf2)(const int&, const int&)){         int bInt = 1;         int cInt = 2;         return aInt + paf2(bInt, cInt);}
 
调用plusFun的代码:
cmpFun pf2 = intCompare;
// 函数指针作为参数int aaInt = 3;cout << plusFun(aaInt, pf2) << endl;
 
 
函数指针作为返回值
一个函数的返回值可以是一个函数指针,这个声明形式写起来有点麻烦:
// 函数指针作为返回值int (*retFunPointer(int))(const int&, const int&);
上面的声明的含义:
a)       retFunPointer是一个函数,该函数有一个int类型的参数;
b)       retFunPointer返回值是一个函数指针,它指向的是带有两个const int&类型参数,且返回类型为int的函数。
 
retFunPointer的定义:
// 函数指针为返回值int (*retFunPointer(int aInt))(const int&, const int&){         cout << aInt << endl;         // pf已经在前面定义过了         return pf;}
 
调用代码示例:
// 函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针cmpFun pf3 = retFunPointer(aaInt);int result = pf3(aaInt, bbInt);cout << result << endl;
 
 
包含上面所有情况的完整代码
#include 
#include
using namespace std; // 定义函数指针pfint (*pf)(const int&, const int&); // 定义函数指针类型cmpFuntypedef int (*cmpFun)(const int&, const int&); // 函数指针作为参数int plusFun(int&, int(const int&, const int&));int plusFun(int&, int(*)(const int&, const int&)); // 函数指针作为返回值int (*retFunPointer(int))(const int&, const int&); // 具体函数int intCompare(const int& aInt, const int& bInt){ if(aInt == bInt) return 0; if(aInt > bInt) { return 1; } else { return -1; }} //函数指针作为参数:错误的做法//int plusFun(int& aInt, int& bInt, int paf(const int& cInt, const int& dInt))//{//// return aInt + bInt + paf(cInt, dInt);//} //函数指针作为参数:正确的做法int plusFun(int& aInt, int& bInt, int paf(const int &, const int &)){ int cInt = 2; int dInt = 1; return aInt + bInt + paf(cInt, dInt);} //函数指针作为参数:错误的做法//int plusFun(int& aInt, int(*paf2)(const int& bInt, const int& cInt))//{// return aInt + paf2(bInt, cInt);//} //函数指针作为参数:正确的做法int plusFun(int& aInt, int(*paf2)(const int&, const int&)){ int bInt = 1; int cInt = 2; return aInt + paf2(bInt, cInt);} // 函数指针为返回值int (*retFunPointer(int aInt))(const int&, const int&){ cout << aInt << endl; // pf已经在前面定义过了 return pf;} int main(void){ int aInt = 1; int bInt = 2; pf = intCompare; // pf = &stringCompare; // 和上面一句是完全一样的 // 使用pf if(pf(aInt, bInt) == 0) { cout << "two integers are equal" << "." << endl; } else if(pf(aInt, bInt) > 0) { cout << aInt << " is greater than " << bInt << "." << endl; } else { cout << aInt << " is less than " << bInt << "." << endl; } cout << "------------------------" << endl; // 用函数指针类型cmpFun声明并初始化一个函数指针pf2 cmpFun pf2 = intCompare; // 使用pf2 if(pf2(aInt, bInt) == 0) { cout << "two integers are equal" << "." << endl; } else if(pf(aInt, bInt) > 0) { cout << aInt << " is greater than " << bInt << "." << endl; } else { cout << aInt << " is less than " << bInt << "." << endl; } cout << "------------------------" << endl; // 函数指针作为参数 int aaInt = 3; int bbInt = 4; cout << plusFun(aaInt, bbInt, pf) << endl; cout << plusFun(aaInt, pf2) << endl; cout << "------------------------" << endl; // 函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针 cmpFun pf3 = retFunPointer(aaInt); int result = pf3(aaInt, bbInt); cout << result << endl; return 0;}

转载地址:http://mxnab.baihongyu.com/

你可能感兴趣的文章
零基础Python学习路线,小白的进阶之路!
查看>>
CSS的23个垂直居中技巧,你都学会了吗?
查看>>
黑客攻击用的最短代码大揭秘,颠覆你的世界观!
查看>>
零基础的自学前端之路,当年的入坑之旅
查看>>
新手程序员?教你解决办法!基础都掌握了,动手敲代码就一脸懵逼
查看>>
程序员快速进阶学习到底要看书还是要看视频?
查看>>
web游戏框架哪家强?国内外精选优质框架分析及注意事项
查看>>
各行业都爱用什么编程语言开发?
查看>>
css3实现ps蒙版效果以及动画,炫酷吊炸天!
查看>>
程序员休息时间接私活遭公司辞退,不明觉厉?
查看>>
CSS 、JS实现浪漫流星雨动画
查看>>
新手网站建设指南(2)
查看>>
新手网站建设优化,这些网站为你提供数之不尽的免费素材!(3)
查看>>
HTML特殊字符显示(常用到的特殊符号,箭头相关,数学相关,标点,符号相关等)...
查看>>
40岁的程序员找不到工作,原来码农真的是碗青春饭
查看>>
2018年前端性能优化总结,这也是我做程序员的第五个年头了
查看>>
前端进阶(三)从0到1学AJAX,这篇就够了!
查看>>
强大的CSS:实现平行四边形布局效果
查看>>
强大的CSS:var变量的局部作用域(继承)特性
查看>>
强大的CSS: 使用“变量种子计数器”扩展动画更多可能性
查看>>