@(001@Objective-C)[回調函數|函數指針|轉移表|C語言|書名--C和指針]node
《C和指針》261頁
函數指針的用途:
1. 對不一樣的數據類型做相同的操做->回調函數
2. 對相同的數據類型做不一樣的操做->轉移表數組
函數指針的聲明:函數
1. int (*f)( int, float ); //f是一個函數指針,函數的返回值爲int,函數的參數分別是int和float 2. int *(*f)(); //f是一個函數指針,函數的返回值爲int * 3. int (*f[])(); //f是一個元素類型爲函數指針的數組,函數的返回值爲int 4. int *(*f[])( int, float ); //f是一個元素類型爲函數指針的數組,函數的返回值爲int *,函數的參數分別是int和float
回調函數
函數A調用函數B時,B的其中一個形參是函數指針pf,B在運行時調用A傳過來的存在pf中的函數指針所指向的函數.pf所指向的函數被稱爲回調函數.指針
爲了函數A可以在不一樣的時刻執行不一樣類型的工做或者執行只能由函數調用者定義的工做.code
在一個單鏈表中查找一個值回調函數
Node *search_list( Node *node, int const value){...}
如何將上面的函數改爲通用的函數,即無論鏈表中保存的值是什麼類型均可以比較?it
Node *search_list( Node *node, void const *value, int (*compare)( void const *, void const * ) ){...}//函數聲明, compare所指向的函數就是回調函數 int compare_ints( void const *a, void const *b ){//回調函數之一 if( *(int *)a == *(int *)b ) return 0; else return 1; } //使用 desired_node = search_list( root, &desired_value, compare_ints );
轉移表
把具體操做和選擇操做的代碼分開,避免出現長長的switch...case..
語句.class
//常規寫法 switch ( oper ){ case ADD: result = add( oper1, oper2 ); break; case SUB: result = sub( oper1, oper2 ); break; case MUL: result = mul( oper1, oper2 ); break; case DIV: result = div( oper1, oper2 ); break; ... } //使用轉移表以後的寫法 double add( double, double ); double sub( double, double ); double mul( double, double ); double div( double, double ); ... double (*oper_func[])( double, double ) = { add, sub, mul, div, ... }; //下面的語句替換前面整條switch語句 result = oper_func[ oper ]( op1, op2 );