函式指標之回撥函式和轉移表
《C和指標》261頁 函式指標的用途:
- 對不同的資料型別作相同的操作->回撥函式
- 對相同的資料型別作不同的操作->轉移表
函式指標的宣告:
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能夠在不同的時刻執行不同型別的工作或者執行只能由函式呼叫者定義的工作.
####舉例: 使用回撥函式提供通用函式
在一個單連結串列中查詢一個值
Node *search_list( Node *node, int const value){...}
複製程式碼
如何將上面的函式改成通用的函式,即不管連結串列中儲存的值是什麼型別都可以比較?
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..
語句.
####舉例:
//常規寫法
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 );
複製程式碼