今天在别人的代码里看到了这样一段东西
typedef enum {
SUBPAGE_HOME,//主页面
SUBPAGE_SETTINGS,//设置页面
SUBPAGE_INFO//信息页面
} ui_normal_subpage_e;
typedef ui_normal_subpage_e (*ui_normal_subpage_handler)(uint8_t mask_row);
很明显第一段是一个结构定义枚举型,这个感觉没什么好说的,主要是为了限制输入的变量而已。
但是第二段就有点看不懂了。
我们先来引进一个固定的格式方便理解
typedef return_type (*alias_name)(parameter_list);
//typedef: This keyword is used to create a new type definition.
//return_type: The type of value that the function returns.
//(*alias_name): The alias name for the function pointer. The asterisk * indicates that it’s a pointer, and the parentheses () group the pointer declaration.
//(parameter_list): The list of parameters that the function takes, enclosed in parentheses.
那么根据这个格式,我们就可以这样大致理解这个语句:
typedef ui_normal_subpage_e (*ui_normal_subpage_handler)(uint8_t mask_row);
//函数指针别名为ui_normal_subpage_handler,输入的参数8位无符号类mask_row,返回的数据类型是ui_normal_subpage_e ,
OK,很明显这里缺少了具体的函数操作。这里再补充一个例子让我来更好地理解这个语句。
typedef int (*math_operation)(int, int);//定义一个typedef,关于数学运算的函数指针,输入两个int类型的数据,返回一个int类型的数据
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
math_operation op;。
//math_operation 由typedef定义,如上所示。
//op 是一个变量!只不过它由math_operation 定义,而math_operation 是一个指向int(int,int)的函数指针,所以他自己也是一个指针。
// op指向add
op = add;
printf("Addition: %d\n", op(5, 3)); // Outputs: Addition: 8
// op指向subtract
op = subtract;
printf("Subtraction: %d\n", op(5, 3)); // Outputs: Subtraction: 2
return 0;
}
从上面的例子我们可以看出,只有有了这个函数指针,且输入参数类型和输出参数类型一致,这个函数指针就可以指向任意的函数。并且调用对应的函数。