发布网友 发布时间:2022-05-13 22:49
共1个回答
热心网友 时间:2022-04-22 12:48
什么是函数指针?函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。 用typedef定义函数指针类型// 定义函数指针类型cmpFuntypedefint (*cmpFun)(constint&, constint&); (3)这样,cmpFun就成了一种数据类型,可以用它来声明和定义形如(1)式中的pf那样的函数指针,比如:cmpFun pf = 0;cmpFun pf = someFunction; 举个例子来说明一下:#include<iostream>#include<string>usingnamespace std; // 定义函数指针pfint (*pf)(constint&, constint&); // 定义函数指针类型cmpFuntypedefint (*cmpFun)(constint&, constint&); // 具体函数int intCompare(constint& aInt, constint& 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; } elseif(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; } elseif(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 (constint&, constint&));(b) int plusFun(int&, int(*)(constint&, constint&));以上两个方式做到的是类似的事情:(a)中的plusFun函数的第三个参数就是一个函数指针, (b)中的第二个参数也是一个函数指针。(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(constint &, constint &)){ 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)(constint&, constint&)){ 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))(constint&, constint&);上面的声明的含义:a) retFunPointer是一个函数,该函数有一个int类型的参数;b) retFunPointer返回值是一个函数指针,它指向的是带有两个const int&类型参数,且返回类型为int的函数。 retFunPointer的定义:// 函数指针为返回值int (*retFunPointer(int aInt))(constint&, constint&){ cout << aInt << endl; // pf已经在前面定义过了 return pf;} 调用代码示例:// 函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针cmpFun pf3 = retFunPointer(aaInt);int result = pf3(aaInt, bbInt);cout << result << endl; 包含上面所有情况的完整代码#include<iostream>#include<string>usingnamespace std; // 定义函数指针pfint (*pf)(constint&, constint&); // 定义函数指针类型cmpFuntypedefint (*cmpFun)(constint&, constint&); // 函数指针作为参数int plusFun(int&, int(constint&, constint&));int plusFun(int&, int(*)(constint&, constint&)); // 函数指针作为返回值int (*retFunPointer(int))(constint&, constint&); // 具体函数int intCompare(constint& aInt, constint& 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(constint &, constint &)){ 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)(constint&, constint&)){ int bInt = 1; int cInt = 2; return aInt + paf2(bInt, cInt);} // 函数指针为返回值int (*retFunPointer(int aInt))(constint&, constint&)</