函數指針數組


一、概念

  • 函數指針: 一個指向函數的指針。一般用函數名表示。
  • 函數指針數組:元素為函數指針的數組。轉移表。c語言中函數不可以定義為數組,只能通過定義函數指針來操作。

二、函數指針數組的使用例子

#include <stdio.h> #include <stdlib.h>
 
int func1(int n) { printf("func1: %d\n", n); return n; } int func2(int n) { printf("func2: %d\n", n); return n; } int main() { int (*a[2])(int);//定義了保存了兩個函數指針的數組
    a[0] = func1; a[1] = func2; a[0](1); a[1](2); return 0; }

 

首先理解下int (*a[2])(int);數組保存指針,什么樣的指針呢?

形如 int func(int input) 的 func函數指針,形參為int變量,返回int變量。
因此,數組保存的是形參為單一int變量和返回值為int值得函數指針。
  a[0] = func1; a[1] = func2;

接下來這兩句話又是什么意思呢?

這句話的意思是由於我們在main函數前聲明和定義了func1和func2兩個函數(這兩個函數滿足前面所提及的函數條件),這時,我們便可以使用這兩個函數指針賦值函數指針數組。

最后,我們便可以使用數組成員來實現函數調用:

 a[0](1); a[1](2);

三、函數指針數組可以解決哪些問題,主要的應用場景在哪?

舉個例子,現在假設前級模塊傳給我二進制數據,輸入參數為 char* buffer和 int length,buffer是數據的首地址,length表示這批數據的長度。數據的特點是:長度不定,類型不定,由第一個字節(buffer[0])標識該數據的類型,共有256(28 )種可能性。我的任務是必須對每一種可能出現的數據類型都要作處理,並且我的模塊包含若干個函數,在每個函數里面都要作類似的處理。若按通常做法,會寫出如下代碼:

void MyFuntion( char* buffer, int length ) { __int8 nStreamType = buffer[0]; switch( nStreamType ) { case 0: function1(); break; case 1: ...... case 255: function255(); break; } }

如果按照這種方法寫下去,那么在我的每一個函數里面,都必須作如此多的判斷,寫出的代碼肯定很長,並且每一次處理,都要作許多次判斷之后才找到正確的處理函數,代碼的執行效率也不高。這是就要用到函數指針數組。

函數指針的概念,前邊也已經說過了,通過例子也可以簡單理解。函數名實際上也是一種指針,指向函數的入口地址,但它又不同於普通的如int*、double*指針。我們從上面(二)例子可以得知,既然函數名可以通過函數指針加以保存,那們也一定能定義一個數組保存若干個函數名,這就是函數指針數組。正確使用函數指針數組的前提條件是,這若干個需要通過函數指針數組保存的函數必須有相同的輸入、輸出值。

那怎么解決上邊那個問題呢?下邊給出了參考。

 

首先定義256個處理函數(及其實現)。
void
funtion0( void ); …….. void funtion255(void ); 其次定義函數指針數組,並給數組賦值。 void (*fun[256])(void); fun[0] = function0; ……. fun[255] = function(); 最后,MyFunction()函數可以修改如下: void MyFuntion( char* buffer, int length ) { __int8 nStreamType = buffer[0];     (*fun[nStreamType])(); }

 

只要2行代碼,就完成了256條case語句要做的事,減少了編寫代碼時工作量,將nStreamType作為數組下標,直接調用函數指針,從代碼執行效率上來說,也比case語句高。

假如多個函數中均要作如此處理,函數指針數組更能體現出它的優勢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM