【C语言】指针与回调机制学习笔记

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* 参数无返回值的函数
函数注册 将函数指针和参数保存,用于后续调用(回调)
相关推荐
学逆向的4 小时前
C 堆区内存管理
c语言·开发语言·网络安全
zhangrelay5 小时前
新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
笔记·单片机·嵌入式硬件·学习
Jimmy5 小时前
深夜突袭:我们的午夜战场
笔记·产品·电子书
阿尼卡~7 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
志尊宝7 小时前
AI原生前端开发(025):端侧AI实战项目:智能笔记助手
人工智能·笔记·ai-native
lll23526917798 小时前
线下多人发言对比与录音操作
笔记·智能手机
叼烟扛炮8 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节
m4Rk_10 小时前
【论文阅读】Agent 记忆机制(113):Agentic Memory Management——从“检索相关信息”走向“管理 Agent 内部记忆”
论文阅读·人工智能·学习·开源·github
深圳老胡11 小时前
STM32C5A3ZG 网络调试总结:从启动失败到连续 Ping 稳定
笔记·stm32·单片机·代码规范
辣知11 小时前
辣知·化智92 《山海经》里的史前密码
学习