هنگامی که یک تابع مانند
int func(){return 0};
تعریف میکنیم func در واقع یک اشاره گر ثابت به تابع مورد نظر است . همانطور که می توانیم اشاره گر غیرثابت به متغیر ها داشته باشیم میتوانیم اشاره گر به تابع نیز داشته باشیم.
int func(){return 0}; int main() { int (*pointerToFunc)()=func; int a=(*pointerToFunc)(); cout<<a<<endl; } /* OUTPUT: 0 */
بنابراین اگر بخواهیم یک اشاره گر به تابع تعریف کنیم از syntax زیر استفاده کرد :
returnType (*nameOfPointer)(typeOfParameter1,typeOfParameter2,....,typeOfParametern);
حال میتوانیم این اشاره گر را برابر با تابعی خاص قرار دهیم.
به دوصورت انجام میشود که روش دوم در کامپایلر های جدید فابل قبول است
(*Pointer)(Arg1,Arg2,Arg3,...,Argn); // explicit Pointer (Arg1,Arg2,Arg3,...,Argn); // implicit
برای مثال :
int foo(int nX){return 0;} int (*pFoo)(int) = foo; // assign pFoo to foo() (*pFoo)(nValue); // call function foo(nValue) through pFoo. pFoo(nValue); // call function foo(nValue) through pFoo.
یکی از کاربرد های اشاره گر به تابع در فرستادن تابعی خاص به عنوان پارامتر تابعی دیگر است تا مثلا از آن بتوان در sort دلخواه استفاده کرد.
#include <algorithm> // for swap // Note our user-defined comparison is the third parameter void SelectionSort(int *anArray, int nSize, bool (*pComparison)(int, int)) { using namespace std; for (int nStartIndex= 0; nStartIndex < nSize; nStartIndex++) { int nBestIndex = nStartIndex; // Search through every element starting at nStartIndex+1 for (int nCurrentIndex = nStartIndex + 1; nCurrentIndex < nSize; nCurrentIndex++) { // Note that we are using the user-defined comparison here if (pComparison(anArray[nCurrentIndex], anArray[nBestIndex])) // COMPARISON DONE HERE nBestIndex = nCurrentIndex; } // Swap our start element with our best element swap(anArray[nStartIndex], anArray[nBestIndex]); } } // Here is a comparison function that sorts in ascending order // (Note: it's exactly the same as the previous Ascending() function) bool Ascending(int nX, int nY) { return nY > nX; } // Here is a comparison function that sorts in descending order bool Descending(int nX, int nY) { return nY < nX; } // This function prints out the values in the array void PrintArray(int *pArray, int nSize) { for (int iii=0; iii < nSize; iii++) cout << pArray[iii] << " "; cout << endl; } int main() { using namespace std; int anArray[9] = { 3, 7, 9, 5, 6, 1, 8, 2, 4 }; // Sort the array in descending order using the Descending() function SelectionSort(anArray, 9, Descending); PrintArray(anArray, 9); // Sort the array in ascending order using the Ascending() function SelectionSort(anArray, 9, Ascending); PrintArray(anArray, 9); return 0; }