网站建设中,中国大陆地区请使用VPN访问,欢迎提建议,关注LSKR Mastodon

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 更整洁、更灵活。


发表评论

Cookie Consent
我们使用 Cookie 来了解您如何使用我们的网站并提升您的体验。这包括个性化内容和广告。
Oops!
It seems there is something wrong with your internet connection. Please connect to the internet and start browsing again.
AdBlock Detected!
We have detected that you are using adblocking plugin in your browser.
The revenue we earn by the advertisements is used to manage this website, we request you to whitelist our website in your adblocking plugin.
Site is Blocked
Sorry! This site is not available in your country.