函数指针除了进行参数传递外,还承接申请的存储空间、释放空间等。而函数指针则主要是用来进行参数传递的,就像引用一样。
例如,我们来看一下函数指针的传递工作。在标准排序算法sort中,对于所提的整数容器vector,无须提供其他操作就可以顺利完成排序任务。代码如下:
1 int a[] = {33,61,12,19,14,71,78,59}; 2 vector<int> aa(a,a+8); 3 sort(aa.begin(),aa.end());
但若整数的大小是以各位数字之和的大小来确定的,则就不能直接使用sort标准函数来排序。需要先定义一个比较函数,然后再对sort传递比较函数指针,以让sort知道大小关系不是默认的整数值比较,而是根据比较函数来判定。可用函数指针调取比较函数,来进行排序工作。代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 using namespace std; 5 6 int bitSum(int a); 7 bool lessThanBitSum(int a, int b){ return bitSum(a) < bitSum(b); }; 8 9 int main() 10 { 11 int a[] = { 33, 61, 12, 19, 14, 71, 78, 59 }; 12 vector<int> aa(a, a + 8); 13 sort(aa.begin(), aa.end(),lessThanBitSum); 14 for (int i = 0; i < aa.size(); ++i) 15 cout << aa[i] << " "; 16 cout << " "; 17 } 18 int bitSum(int a) 19 { 20 int sum = 0; 21 for (int x = a; x; x /= 10) sum += x % 10; 22 return sum; 23 }
第13行的sort调用,其第三个实参为比较函数名lessThanBitSum,函数名即为函数指针,正像数组名即为指针一样。sort的形参为一个相对应的函数指针,正像数组传递中,形参为对应的指针那样。
标准排序算法的使用,依赖于容器中元素类型的小于“<”操作,如果排序的容器中是整数元素,那么,小于“<”的比较判断函数可以省略。因为整数的大小比较操作在C++中本来就具备。否则,sort函数的调用还必须提供第三个参数——指针函数。其参数类型为某个元素类型T的bool(const T&,const T&)。