函数指针类型定义笔记

函数指针类型定义笔记

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

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();
相关推荐
HwJack2011 分钟前
UIAbility 生命周期全链路:从冷启动到热启动的实战笔记
笔记·华为·harmonyos
九硕智慧建筑一体化厂家15 分钟前
直流智能照明|全场景节能升级!打造安全低碳的智慧建筑光环境
运维·笔记·安全·智慧城市
yiqiefeimeng19 分钟前
C语言指针难倒90%人?买房比喻让你瞬间开窍
c语言·学习·编程·指针·比喻
caimouse1 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言
振南的单片机世界1 小时前
看门狗硬核拆解:1.6秒不喂狗,硬件强制“掀桌子”
arm开发·stm32·单片机·嵌入式硬件
嵌入式阿蔡1 小时前
Linux_01:交叉编译与开发环境实战——从单片机跨到 Linux 的第一道坎
linux·运维·网络·单片机·嵌入式硬件·嵌入式实时数据库
happyprince2 小时前
01-整体观-Codex全貌解读(源码)
算法·ai编程
俊基科技2 小时前
别自己写算法了,让这颗37.5毫米的模组替你“闭嘴干活”
神经网络·算法·硬件开发·ai降噪·语音模块·回音消除
_Narcissus_2 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径