回调函数预备知识
在讲解回调函数之前,我们需要了解函数指针。
函数指针
int *p1; // p1 是一个指向整数(int)类型的指针变量
char *p2; // p2 是一个指向字符(char)类型的指针变量
STRUCT *p3; // p3 是一个指向结构体类型 STRUCT 的指针变量
我们一般很少使用函数指针,通常直接使用函数调用。下面来了解一下函数指针的概念和使用方法。
什么是函数指针
函数指针也是个指针,但是和通常的指针不一样。通常的指针指向的是整型、字符型或数组等变量,而函数指针指向的是函数。
函数指针的语法
返回类型 (*指针变量名)(参数类型列表);
- 返回类型: 函数返回的数据类型(如 int, double, void 等)。
- 指针变量名: 你给这个函数指针起的名字。
- 参数类型列表: 函数接受的参数类型(如果没有参数,可以留空或写 void)。
这里需要注意的是:**(*指针变量名)**两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针,而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
那么怎么判断一个指针变量是指向变量的还是指向函数的呢?
- 首先看变量名前面有没有'*',如果有说明是指针变量;
- 其次看变量名有没有带 (),如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。
最后需要注意的是:指向函数的指针变量没有 ++ 和 – 运算。
一般为了方便使用,我们会选择用 typedef 进行函数指针类型的别名定义。
// 定义一个函数指针类型 别名为:Fun1,它指向返回 int 类型、接受一个 int 参数的函数
typedef int (*Fun1)(int);
// 定义一个函数指针类型 别名为:Fun2,它指向返回 int 类型、接受两个参数(int 和 int)的函数
typedef int (*Fun2)(int, int);
// 定义一个函数指针类型 别名为:Fun3,它指向返回 void 类型、无参数的函数
typedef void (*Fun3)(void);
// 定义一个函数指针类型 别名为:Fun4,它指向返回 void* 类型、接受一个 void* 参数的函数
typedef * (*Fun4)(*);


