关于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
相关产品推荐
相关产品推荐

