You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于ReceiveInit接收无实参CMD_GetChar函数的技术疑问

C语言函数指针调用解惑

1. 为什么ReceiveInit能直接传CMD_GetChar?

  • ReceiveInit的参数void (*RxCb)(uint8_t *rxChar)是函数指针,它的作用是接收一个“以uint8_t*为参数、无返回值”的函数的地址。
  • 在C语言里,函数名本身就代表该函数在内存中的地址,所以直接传CMD_GetChar就是把这个函数的地址赋值给RxCb,完全不需要加括号和实参——要是加了括号,那就是直接调用CMD_GetChar,传的是它的返回值(但这里它没返回值,反而会报错)。

2. ReceiveInit内部怎么调用CMD_GetChar?

你给的示例里ReceiveInit是空的,但实际用的时候,它会在内部准备好要传递的实参(一个uint8_t变量的地址),然后通过函数指针触发调用:

void ReceiveInit( void (*RxCb)(uint8_t *rxChar) )
{
    uint8_t recv_buf;
    // 调用传入的函数,把recv_buf的地址作为实参传给CMD_GetChar的rxChar参数
    RxCb(&recv_buf);
    // 接下来就可以用recv_buf处理接收到的数据了
}

这里的&recv_buf就是你疑惑的“实参”,它是在调用函数指针的时候补全的,不是在传递函数地址的时候传。

3. 纠正你的初始误解

你一开始以为ReceiveInit接收的是uint8_t*类型参数,这是把普通变量指针和函数指针搞混了:

  • uint8_t*是指向单个uint8_t变量的指针;
  • void (*RxCb)(uint8_t *)是指向特定函数的指针,两者属于完全不同的类型,不能混为一谈。

内容的提问来源于stack exchange,提问作者jabroni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:20:28