實現函數的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
頂多,就是為了傳址呼叫,才會使用
不過課本上總是有些高階用法,像是函數指標,或是指標陣列
很少看人使用到
因為最近在改寫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
留言