函数指针类型定义笔记

函数指针类型定义笔记

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

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();
相关推荐
九成宫13 小时前
IT项目管理期末复习——Chapter 7 项目成本管理
笔记·项目管理·软件工程
白羊by13 小时前
Softmax 激活函数详解:从数学原理到应用场景
网络·人工智能·深度学习·算法·损失函数
故事和你9114 小时前
洛谷-算法1-7-搜索3
数据结构·c++·算法·leetcode·动态规划
【ql君】qlexcel14 小时前
Visual Studio Code开发STM32设置头文件宏定义uint32_t报错
vscode·stm32·vs code·头文件宏定义·uint32_t报错·uint8_t报错·uint16_t报错
爱编码的小八嘎14 小时前
C语言完美演绎8-7
c语言
chipsense14 小时前
霍尔电流传感器选型方法论再升级:从800V平台到TMR竞争的全场景决策树
算法·决策树·机器学习·闭环霍尔·tmr传感
CoderYanger14 小时前
14届蓝桥杯省赛Java A 组Q1~Q3
java·开发语言·线性代数·算法·职场和发展·蓝桥杯
振浩微433射频芯片14 小时前
标签界的“千里眼”:VRT5312,150cm超远读写距离,重新定义RFID新可能!
科技·单片机·嵌入式硬件·物联网
会编程的土豆15 小时前
【日常做题】 代码随想录(岛屿最大面积+寻宝)
数据结构·算法·图论
阿洛学长15 小时前
汉洛塔结构思维
算法