博學,切問,近思--詹子知 (https://jameszhan.github.io)
1. 基礎知識:
1) 定義函數指針:
return_type (*func_pointer)(parameter_list)
2) 定義返回函數指針的函數:
return_type(*function(func_parameter_list))(parameter_list)
定義了一個函數function,該函數的參數列表是(function_patameter_list),返回類型是一個函數指針,這個函數指針的原型是return_type(*)(parameter_list)。
2. 經典例子[signal函數原型]
Linux 2.0之前版本
void (*signal (int signo,
void (*func)(int))) (int);
Linux 2.6 版本
typedef void (*__sighandler_t) (int);
extern __sighandler_t signal (int __sig, __sighandler_t __handler)
3. Example
可以用以下兩種方式定義返回函數指針的函數。第二種方式是第一種方式的替換, 也更易理解。
1). int (*OP(char))(int,
int);
2). typedef int OP(int,
int);
OP* fun(char c);
#include<stdio.h>
int (*opp(char))(int,
int);
typedef int OP(int,
int);
OP* fun(char c);
int add(int a,
int b){
return (a + b);
}
int product(int a,
int b){
return (a * b);
}
int main(void){
int a =
2, b = 23;
printf("Hello World:%d, %d/n", opp('+')(a, b), opp('*')(a, b));
printf("Hello World:%d, %d/n", fun('+')(a, b), fun('*')(a, b));
return 0;
}
int (*opp(char c))(int a,
int b){
if(c ==
'+'){
return add;
}else{
return product;
}
}
OP* fun(char c){
if(c ==
'+'){
return add;
}else{
return product;
}
}