【C语言】指针与回调机制学习笔记
1️⃣ 指针基础
- 指针是变量,保存另一个变量的内存地址。
- 定义格式:
int a = 10;
int *p = &a; // p 是指向 int 类型变量 a 的指针
- 重要符号说明:
表达式 | 含义 |
---|---|
p | 指针变量本身,保存地址值 |
*p | 解引用,访问指针指向地址上的内容 |
&a | 取地址符,获取变量 a 的内存地址 |
- 例子:
int x = 5;
int *p = &x;
printf("x = %d\n", *p); // 输出5
2️⃣ void *
指针(通用指针)
void *
是通用指针,可以指向任何类型数据。- 不能直接解引用,必须先强制类型转换。
- 常用于函数参数泛化和动态内存分配。
示例:
void printInt(void *data) {int *p = (int *)data;printf("value: %d\n", *p);
}int a = 100;
printInt(&a);
3️⃣ 函数指针
- 函数指针变量用于存储函数的地址。
- 语法格式:
返回值类型 (*指针变量名)(参数类型列表)
- 示例:
void greet(char *name) {printf("Hello, %s!\n", name);
}void (*fp)(char *) = greet;
fp("LBDX");
4️⃣ 函数注册与回调机制
4.1 函数指针类型定义
typedef void (*Callback)(void *);
typedef
定义一个类型别名Callback
。Callback
表示一个函数指针,指向接受一个void *
参数且无返回值的函数。
4.2 注册函数定义
void registerTask(Task *task, Callback cb, void *arg)
-
registerTask
是注册任务的函数,无返回值。 -
参数:
Task *task
:指向任务结构体指针。Callback cb
:函数指针,注册的回调函数。void *arg
:传给回调函数的参数。
4.3 函数内部赋值
task->func = cb; // 记录回调函数
task->arg = arg; // 记录回调参数
4.4 完整示例
#include <stdio.h>typedef void (*Callback)(void *);typedef struct {Callback func;void *arg;
} Task;void registerTask(Task *task, Callback cb, void *arg) {task->func = cb;task->arg = arg;
}void runTask(Task *task) {if (task && task->func) {task->func(task->arg);}
}void sayHello(void *arg) {char *name = (char *)arg;printf("Hello, %s!\n", name);
}void showNumber(void *arg) {int *num = (int *)arg;printf("Received number: %d\n", *num);
}int main() {Task task1, task2;char name[] = "LBDX";int number = 42;registerTask(&task1, sayHello, name);registerTask(&task2, showNumber, &number);runTask(&task1);runTask(&task2);return 0;
}
输出:
Hello, LBDX!
Received number: 42
5️⃣ 重要总结
术语 | 说明 |
---|---|
*p | 解引用,访问指针指向地址的值 |
&x | 取地址,获取变量 x 的地址 |
void * | 通用指针,可指向任意类型,需强转 |
函数指针 | 存储函数地址,可间接调用函数 |
typedef void (*Callback)(void *) | 定义函数指针类型,指向接受 void* 参数无返回值的函数 |
函数注册 | 将函数指针和参数保存,用于后续调用(回调) |