一開始看函式指標的時候我是很懵的,因為不知道它有什麼用,之後慢慢就發現了自己的愚昧無知。
假設我們想實現乙個資料結構,比如二叉搜尋樹,堆。又或者是乙個快排,歸併排序。
我們一般是直接在兩個數要比較的時候直接採用運算子比較大小,但是這樣的缺點是,如果我要大頂堆就要單獨寫大頂堆,小頂堆也要單獨實現。
很明顯這樣的**復用性很低,兩串除了比較運算子不同其他全部相同的**自己看著也難受,這個時候就是函式指標出馬的時候了。比如下面我寫的這個堆
#includeusing(如果寫錯了告訴我一下,我寫完沒嚴謹的測試一下, 因為重點是講函式指標)namespace
std;
const
int maxn = 100007
;typedef
bool (*pf)(int,int);///
這句定義意思是:pf型別是指向bool (int, int)型別函式的函式指標
bool cmp1(int a, int b) ///
struct
heap;///
預設用大頂堆的比較函式大頂堆
void shift_up(int
now)
else
break
; }
}void shift_down(int
now)
else
break
; }
}bool empty()
int top()
void
pop()
void push(int
val)
};
上面那個函式裡面有乙個函式指標;
這個指標在建構函式裡初始化是cmp2,為了構建大頂堆。
但是我們要小頂堆也很容易,heap hh(cmp1);這樣定義出來的hh就是小頂堆,同理我們就可以實現自己的二叉搜尋樹等等。
比如下面的這個快排就是用傳入的函式指標來排序,這樣可以公升序降序都沒問題。、
1 #include2快速排序using
namespace
std;
3const
int maxn = 100007
;4 typedef bool (*pf)(int,int);///
這句定義意思是:pf型別是指向bool (int, int)型別函式的函式指標
5bool cmp1(int a, int b) ///
7int single_sort(int l, int r, int num, pf cmp=cmp1)
17 num[l]=key;
18return
l;19}20
void qsort(int l, int r, int num, pf cmp=cmp1)
26int
main() ;
28 qsort(0, 9
, num, cmp2);
29for(int i=0; i<10; ++i)
32 }
同理其他排序也可以做到這樣
函式指標例項
1.定義 每乙個函式都占用一段記憶體單元,它們有乙個起始位址,指向函式入口位址的指標稱為函式指標。2.語法 指向函式的指標變數的一般定義形式為 資料型別 指標變數名 參數列 3.說明 1 函式指標的定義形式中的資料型別是指函式的返回值的型別。2 區分下面兩個語句 int p int a,int b ...
C 函式指標簡單使用
函式指標必須包含要呼叫的函式的記憶體位址,為了工作正確,指標還必須包含其他資訊,即指標所指向的函式的引數列表中的引數型別以及返回型別。因此,在宣告函式指標時,必須指定該指標可以指向的函式的引數型別和返回型別,以及指標名。函式指標的一般形式如下 返回型別 指標明名 引數型別列表 注意 指標名上的括號是...
函式指標例項2
c語言函式指標的定義形式 返回型別 函式指標名稱 引數型別,引數型別,引數型別,c 函式指標的定義形式 返回型別 類名稱 函式成員名稱 引數型別,引數型別,引數型別,以下 編譯環境 codeblocks with gcc in win 7 c語言函式指標使用舉例 複製 include include...