函数指针类型定义笔记

函数指针类型定义笔记

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

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();
相关推荐
leo__5206 小时前
STM32 MAX30102 心率血氧测量代码
stm32·单片机·嵌入式硬件
平凡但不平庸的码农7 小时前
Go Slice 详解
算法·golang
Jasmine_llq10 小时前
《B3867 [GESP202309 三级] 小杨的储蓄》
算法·循环遍历·数组累加(模拟)·索引定位·顺序输出
啦啦啦_999910 小时前
案例之 逻辑回归_电信用户流失预测
算法·机器学习·逻辑回归
yuan1999710 小时前
STM32 IAP 电量计源码
stm32·单片机·嵌入式硬件
风筝在晴天搁浅10 小时前
快手/字节 CodeTop LeetCode 415.字符串相加
算法·leetcode
学不懂飞行器11 小时前
从小白到国奖:全国大学生电子设计竞赛(电赛)高质量备赛全攻略
stm32·单片机·嵌入式硬件
DragonnAi11 小时前
猫咪如厕检测与分类识别系统系列【十四】 项目结构重新整理-即将开源完整算法
算法·开源
机器视觉_Explorer11 小时前
【halcon】编程技巧:鼠标擦除
图像处理·人工智能·深度学习·算法·视觉检测
perseverance5211 小时前
STM32F405 ADC+DMA双缓冲规则组采集
stm32·adc