實現函數的Table化

一般來說,大多數人很少使用到C的指標
頂多,就是為了傳址呼叫,才會使用
不過課本上總是有些高階用法,像是函數指標,或是指標陣列
很少看人使用到

因為最近在改寫ASM到C,之前都是用switch case去解譯 ASM的Table
覺得寫起來要很多的重複動作,很麻煩,不禁就懷念起ASM的Table了

所以就花了一個早上研究了一下
學會了function pointer 和 pointer array

1. function pointer : 函數指標,用指標指向一個函數,很簡單,方法就是
void *Func1(void);    // Func1 就是函數指標

2.pointer array : 定義一個陣列,元素都是指標,這也很簡單
int * array[3];    //  array[] 的元素是 int *


3.比較複雜一點了, 一個陣列,裡面的元素是一堆指向 函數的陣列
void Func1(void){........};
void Func2(void){........};
void (* ptrtbl[3])(void) ={Func1 , Func2};    //  陣列 ptrtbl[3] , 元素是 指向函數的指標

--------------------------------------------------

有看懂嗎?我們比較case 1 和cas 3
case 1. void *Func1(void);    // Func1 就是函數指標
case 3. void (* ptrtbl[3])(void) ={Func1 , Func2};    //  陣列 ptrtbl[3] , 元素是 指向函數的指標
首先,以優先性來說,  void (* ptrtbl[3])(void)  , 優先性最高是 第一個( ) , 所以要先看()裡面,

所以 * ptrtbl[3] 是要宣告的元素 , 一個陣列,元素是指標
哪一個指標呢 ? 會不會覺得型態下很像case 1 ,是的,是一個函數指標

舉一個sample code
void main(void){
        void (*functabl2[2])(void) = {func1,func2};
        functabl2[0]( );   // 執行 func1( )
        functabl2[1]( );   // 執行 func2( )
}
void func1(void){cout << "Hello World";}
void func2(void){cout << "Goodbye World";}
----------------------

這樣的話,要建function的table就很簡單了XDD
Have a nice day

留言

這個網誌中的熱門文章

如何在VS2022 Community 簡要的設定UDK2018的環境

自製讀取 H 檔案並找出 define 的程式

如何Build UDK2018