函數指針除了進行參數傳遞外,還承接申請的存儲空間、釋放空間等。而函數指針則主要是用來進行參數傳遞的,就像引用一樣。
例如,我們來看一下函數指針的傳遞工作。在標准排序算法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 << "\n"; 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&)。