函数指针类型定义笔记

函数指针类型定义笔记

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

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();
相关推荐
Wect2 小时前
LeetCode 215. 数组中的第K个最大元素:大根堆解法详解
前端·算法·typescript
深邃-2 小时前
数据结构-双向链表
c语言·开发语言·数据结构·c++·算法·链表·html5
2401_878530212 小时前
分布式任务调度系统
开发语言·c++·算法
CinzWS2 小时前
中断向量表中断号与 CMSIS IRQn 映射关系深度剖析:从硬件索引到软件句柄的桥梁
arm开发·架构·系统架构·嵌入式·cortex-m3·中断
艾莉丝努力练剑2 小时前
【Linux:文件】文件基础IO进阶
linux·运维·服务器·c语言·网络·c++·centos
叶子野格2 小时前
Notepad++编写html文件使用D3绘图:数据可视化
笔记·学习·信息可视化·开源·notepad++
_深海凉_2 小时前
LeetCode热题100-两数之和
算法·leetcode·职场和发展
程序猿编码2 小时前
基于ncurses的TCP连接可视化与重置工具:原理与实现(C/C++代码实现)
linux·c语言·网络·c++·tcp/ip
nunca_te_rindas2 小时前
算法刷体小结汇总(C/C++)20260328
c语言·c++·算法