函数指针类型定义笔记

函数指针类型定义笔记

一、错误写法(不要记!)

c 复制代码
#define (void *)func(void)     // ❌ 宏名不能是表达式
typdef (void *)func(void)      // ❌ 拼写错误+语法错误

二、正确写法对比

1. typedef 方式(推荐)
c 复制代码
typedef void *(*VoidFunc)(void);
  • VoidFunc 是一个类型名
  • 表示:指向「返回 void*、无参数」的函数的指针类型
  • 优点:类型安全、支持作用域、清晰易读
2. #define 宏方式
c 复制代码
// 定义类型宏
#define VOID_FUNC_TYPE void*(*)(void)

// 定义变量声明宏
#define DECLARE_VOID_FUNC(name) void*(*name)(void)

// 定义并初始化宏
#define DEFINE_VOID_FUNC(name, func) void*(*name)(void) = func
  • 缺点 :纯文本替换,可能产生歧义,不如 typedef 安全

三、语法解析

c 复制代码
typedef void *(*VoidFunc)(void);
        ↑    ↑    ↑        ↑
       返回值 指针 类型名   参数列表

阅读顺序(从内到外):

  1. VoidFunc --- 标识符
  2. *VoidFunc --- 是指针
  3. (*VoidFunc)(void) --- 指向函数
  4. void *(*VoidFunc)(void) --- 函数返回 void*

四、使用示例

c 复制代码
// 定义函数
void* get_message(void) {
    return "Hello";
}

// 使用 typedef
typedef void *(*VoidFunc)(void);
VoidFunc f1 = get_message;
void *result = f1();  // 调用

// 使用宏
#define VOID_FUNC_TYPE void*(*)(void)
VOID_FUNC_TYPE f2 = get_message;

五、常见变体

类型 写法
返回 int,无参数 typedef int (*IntFunc)(void);
返回 void*,带 int 参数 typedef void* (*FuncWithInt)(int);
返回 void,无参数 typedef void (*VoidFunc)(void);
返回结构体指针 typedef struct Point* (*PointFunc)(int, int);

六、为什么 typedef 优于 #define?

c 复制代码
// typedef - 正确
typedef void*(*FuncPtr)(void);
FuncPtr p1, p2;  // p1 和 p2 都是函数指针 ✅

// #define - 有坑
#define FUNC_PTR void*(*)(void)
FUNC_PTR p1, p2;  
// 展开后: void*(*)(void) p1, p2;
// 实际: void*(*p1)(void), p2;
// p2 是 void* 类型,不是函数指针! ❌

七、记忆口诀

复制代码
函数指针不好记,typedef 来帮你
从里往外慢慢看,先名后指再函数
返回值类型放最前,参数列表放最后

核心公式

c 复制代码
typedef 返回值类型 (*类型名)(参数列表);

八、快速参考卡片

c 复制代码
// 1. 声明函数指针变量
void *(*ptr)(void);

// 2. 定义函数指针类型
typedef void *(*FuncType)(void);

// 3. 声明并初始化
void *(*ptr)(void) = &function_name;

// 4. 使用类型别名
FuncType ptr = function_name;

// 5. 调用
void *result = ptr();
相关推荐
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
怕浪猫3 天前
Electron 系列文章封面图
算法·架构·前端框架