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