如果一個指針指向某個函數,那么它便是函數指針。有時候我們如果需要在一個循環中,每次調用不同的函數(這些函數的返回值和參數相同,函數名不同,實現不同),那么就可以使用函數指針數組來使代碼更加簡練和易讀。那么,怎樣定義函數指針數組呢?
一、什么是函數指針
在定義函數指針數組之前,需要首先知道什么是函數指針。函數指針的定義形象點來說,就是用一個指針變量代替原函數中的函數名位置。
原函數
int Add(int a,int b)
函數指針定義(不需要加入&取值符號,因為函數標識實際上就是一個地址)
int (*p)(int ,int)
p=Add
調用(直接替代原有標識,類比數組傳參)
p(A,B)
實際上這與普通的指針定義是非常類似的,所注意的地方便是因為優先級的原因將*p加上括號(類比指向二維數組的指針的定義方式)
·定義的一些注意事項
指針函數類型的定義比其他指針的定義更加嚴格,即為必須做到參數的完全對應,如以下例子
錯誤
int (*p)(int)=Add
int (*p)(double)=Add
正確
int (*p)(int ,int)=Add
在C中,我們所接觸到的第一個函數指針應該是qsort排序,這也使我們能夠根據不同的情況調用不同的函數。
二、函數指針數組的定義
情況假定:編寫一個這樣一個數組,這一個數組可以用於索引一系列的排序函數
實現其實非常簡單我們只需在改寫(*p)為(*p[MAX])就行了
實現:
int(*sort[]) =
{
Bubble_sort, //冒泡排序
Select_sort, //選擇排序
Insert_sort, //插入排序
Shell_sort, //希爾排序
Merge_sort, //歸並排序
Heap_sort, //堆排序
Qsort, //快速排序
Radix_sort //基數排序
}
·題外話,如何分配一個函數指針數組的空間
int (*pfunct)(int, int) = (int (*)(int, int))calloc(20, sizeof(int (*)(int, int)));
感覺這個在cpp中的作用更大(小聲BB)
