C语言中函数指针的定义和用法
本文详细解释下C语言中函数指针的各个组成部分以及实际的常见使用场景。
函数指针定义
typedef void (*gf_timer_cbk_t)(void *);
来详细拆解一下这句代码:typedef void (*gf_timer_cbk_t)(void *);
这是一条 typedef
函数指针类型定义语句,用于定义一个新的类型名 gf_timer_cbk_t
,它表示一个函数指针。
一步步拆解
typedef
这是 C 语言中的关键字,用于给一个类型起别名,让代码更简洁可读。
void (*gf_timer_cbk_t)(void *)
这是函数指针的写法,读起来有点复杂,我们把它拆成几个部分:
部分 | 说明 |
---|---|
void | 表示这个函数没有返回值。 |
(*gf_timer_cbk_t) | 表示这是一个函数指针类型,名字叫 gf_timer_cbk_t 。 |
(void *) | 表示这个函数接收一个void * 类型的参数(即任意类型的指针)。 |
换句话说,gf_timer_cbk_t
表示:
“一个指向函数的指针,这个函数接收一个 void * 类型的参数,并且不返回任何值。”
举个实际例子
我们来看一个示例来帮助理解:
void my_callback(void *data) {
printf("Callback called with message: %s\\n", (char *)data);
}
gf_timer_cbk_t cb = my_callback;
cb("Hello Timer!");
my_callback
是符合gf_timer_cbk_t
类型的函数:它接收一个void *
,没有返回值。然后我们把这个函数赋值给变量
cb
(它是一个gf_timer_cbk_t
类型的函数指针)。调用
cb(...)
就相当于调用my_callback(...)
。
为什么用 void *
因为这样可以传递任意类型的数据。常见用法是:
传入一个结构体、字符串、数组等的指针;
然后在回调函数中将
void *
强制转换为正确的类型来使用。
这在定时器或异步事件中非常常见——你设定一个回调函数和它需要的数据,等到时间到了,就把这块数据交给回调函数处理。
总结
typedef void (*gf_timer_cbk_t)(void *);
意思是:*定义了一个函数指针类型 gf_timer_cbk_t
,它可以指向任何*接受一个 void \*
参数、返回值为 void
的函数。
这种写法常用于定时器、线程、事件循环中,给“回调函数”做统一类型定义,使得 API 更整洁、更灵活。
加入对话