通俗易懂的函式指標及函式指標陣列
函式指標
指標我們知道實際上是一個變數或者陣列等的地址。如我們定義:
void *Ptr;
該指標變數可以指向我們希望指向的地址,如我們有陣列為a[2] = {0,1}
,那麼我們可以通過給指標變數賦值,使其指向該陣列Ptr = a;
。
函式指標實際上和這種指標類似,只不過其變數型別是一個函式型別而已。如果覺得搞不明白,可以把函式型別理解為和int
一樣的資料型別。
如我們可以這樣定義一個函式
void DataTrans(int Data, int Len)
那麼同樣我們可以這樣定義一個函式指標
void (*DataTransPtr)(int Data,int Len)
對比函式的定義和函式指標的定義可以發現,不同的是函式指標需要在函式名前加上 *
DataTransPtr = DataTrans;
或者DataTransPtr = &DataTrans;
兩者等價。
指標變數定義時需要加 星號,使用時不需要加。使用時如果加的話便是取該地址上的值了。
函式指標陣列
從上面可以看出給函式指標賦值時我們用了兩種方式,其實C語言中的函式名本身代表的就是該函式的首地址。因此對於函式指標陣列而言,直接使用函式名即可。
首先定義3個函式為
void FA(int a, int b); void FB(int a, int b); void FC(int a, int b);
然後定義一個同類型的函式指標
void (*FPtr)(int a, int b);
然後定義一個數組
void array[3];
對於以上的三種定義可以類比為變數的定義,類比如下
我們定義了3個變數分別為
int F1; int F2; int F3;
然後定義了一個同類型的指標變數
int *F1;
然後定義了一個數組
int array_int[3];
當然我們可以把三個變數的值賦給陣列array_int[0] = F1;
想要賦值的話需要保證F1
和array_int
的型別相同,例子中他們都是int
型,所以可以賦值。
那麼對於函式指標陣列來說,如果要給函式指標陣列賦值,也同樣需要保證型別一致。
首先我們需要把函式指標重新做一下定義
typedef void(* FPtr)(int a, int b);
這樣是重新定義了一個新型別,也就是函式指標型別,可類比int
。
然後對陣列定義
FPtr array[3];
這樣陣列的型別就是函式指標型別,可以通過對陣列賦值完成函式的呼叫,如
FPtr array[] = {
FA;
FB;
FC; }
當我們需要呼叫函式FA
時,可直接使用array[0](a, b)
來呼叫。