C语言指针与回调函数
👇😊 C语言函数指针 😊👇
🌈 1. 函数指针是什么?
想象你有一个遥控器📱,可以控制不同的电器(比如电视、空调)。每个按钮对应一个功能。
- 函数指针就像这个遥控器,它“指向”一个函数,按下按钮(调用指针)就能执行对应的函数!
- 本质:存储函数的内存地址,通过地址调用函数。
🌈 2. 函数指针的声明与赋值
2.1 声明函数指针
📝 语法:返回类型 (*指针名)(参数类型1, 参数类型2...);
1 | // 声明一个指向“接受两个int参数,返回int”的函数的指针 |
🔍 对比普通函数声明:
1 | int max(int a, int b); // 普通函数 |
2.2 给函数指针赋值
将函数名(即函数地址)赋给指针(&可省略):
1 | pFunc = max; // 正确 ✅ |
❌ 错误示例:
1 | pFunc = max(); // ❌ max()是调用函数,返回int,无法赋值给指针! |
🌈 3. 通过函数指针调用函数
3.1 直接调用
1 | int result = pFunc(3, 5); // 等价于 max(3,5) |
3.2 解引用调用(清晰写法)
1 | int result = (*pFunc)(3, 5); // 与上面等价 |
🌰 完整示例:
1 |
|
🌈 4. 函数指针的用途:回调函数(超重要!)
4.1 什么是回调函数?
- 你定义函数 → 别人调用你的函数
- 场景:将函数作为参数传递给另一个函数,在特定事件发生时被调用。
🌰 生活比喻:
- 你去餐厅吃饭,排队等位时留下手机号(注册回调函数)。
- 有空位时,餐厅打电话通知你(触发回调)。
- 你去就餐(执行回调函数)。
4.2 代码示例:生成随机数组
1 |
|
输出示例:
1 | 随机数组:1804289383 846930886 1681692777 ... |
🌈 5. 函数指针的高级用法
5.1 函数指针数组
可以创建函数指针数组,实现“多态”效果。
1 | // 定义两个函数 |
5.2 使用typedef简化
为复杂的函数指针类型定义别名,提高可读性。
1 | // 定义类型别名 |
❌ 6. 常见错误与注意事项
函数签名不匹配:
1
2int max(int a, int b);
void (*p)(int, int) = max; // ❌ 返回类型不匹配!错误传递回调函数:
1
fillArray(arr, 10, getRandom()); // ❌ 加了括号,传递的是int而非函数指针!
未初始化函数指针:
1
2int (*p)(int, int);
p(1, 2); // ❌ p未赋值,指向随机地址 → 程序崩溃!
🌈 7. 综合练习
练习1:排序策略选择
写一个排序函数 void sort(int arr[], int size, CompareFunc compare),根据传入的比较函数决定升序或降序排序。
- 定义两个比较函数:
int ascending(int a, int b)(a>b返回1)和int descending(int a, int b)(a<b返回1)。 - 在main函数中测试两种排序方式。
练习2:计算器函数
用函数指针数组实现计算器(加、减、乘、除),根据用户选择调用对应操作。
练习3:找错误
以下代码有什么问题?
1 | int add(int a, int b) { return a + b; } |
🎯 参考答案
练习1:
1 | // 比较函数 |
练习2:
1 |
|
练习3:
错误:函数指针 p 的声明参数数量与 add 不匹配。
修正:
1 | int (*p)(int, int) = add; // 参数应为两个int |
🚀 总结:
- 函数指针是指向代码的指针,实现灵活的函数调用。
- 回调函数是“你定义,别人调用”的机制,广泛用于事件处理、库设计。
- 牢记函数签名匹配,避免野指针调用!
口诀:函数指针像遥控,指向函数真奇妙,回调机制很灵活,签名一致要记牢! 🎮🔧
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matou🚢!
评论


