函式指標是指向函式的指標變數。
程式在編譯時,每一個函式都有一個入口地址,該入口地址就是函式指標所指向的地址。
1. 函式指標的宣告
bool (*pf)(int, int);
//pf指向一個函式,該函式的引數是兩個int,返回值是 bool 型別
2. 函式指標的初始化
//例如有這樣一個函式:bool cmp(int a, int b);
pf = cmp//注意 cmp 型態及返回值應與宣告的的函式指標的型別匹配
3. 呼叫函式指標
bool b = pf(3,5);
等價於直接呼叫:bool b = cmp(3,5);
函式指標有兩個方面的應用:
1. 把指標函式當作形參傳遞給某些具有一定通用功能的模組。並封裝成介面來提高程式碼的靈活性和後期維護的便捷性
example:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
1. 待排序陣列首地址
2. 陣列中待排序元素數量
3. 各元素的佔用空間大小
4. 指向函式的指標,用於確定排序的規則 (可提供不同的排序法)
歸納為:便於分層設計、利於系統抽象、降低耦合度以及使介面與實現分開。
這裡通過比較一個比較 low 的氣泡排序來說明一下 qsort 內部函式指標的實現機制:
#include<iostream>
using namespace std;
void sort(int arr[], int size, bool(*cmp)(int,int));
bool up(int a, int b);
bool down(int a, int b);
int main()
{
int arr[10];
for (int i = 0;i < 10;++i)
cin >> arr[i];
sort(arr, 10,down);
for (int i = 0;i < 10;++i)
cout << arr[i] << " ";
return 0;
}
void sort(int arr[],int size,bool(*cmp)(int,int))//簡單氣泡排序
{
int temp;
for (int i = 0;i < size-1; ++i)
{
for (int j = i;j < size-1;++j)
{
if (cmp(arr[i], arr[j + 1]))
{
temp = arr[i];
arr[i] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
bool up(int a, int b)
{
if (a > b)
return 1;
else
return 0;
}
bool down(int a, int b)
{
if (a > b)
return 0;
else
return 1;
}
2. 有些地方必須使用函式函式指標才能完成給定的任務,如linux系統中的非同步訊號中斷處理,當發生某一觸發訊號時,需要呼叫相應的處理函式,此時需要使用函式指標來實現。
void (*signal(int signum,void(* handler)(int)))(int);
引數一為訊號條件,第二個引數為一個函式指標,它所指向的函式需要一個整型引數,無返回值。
該函式的返回值也是一個函式指標,返回的指標所指向的函式有一個整型引數(一般不用)
No comments:
Post a Comment