【发布时间】:2016-06-12 12:10:29
【问题描述】:
我目前通过 spi 发送命令如下:
我想创建一个函数来发送任何传递给它的命令。我可以将字节数组作为参数传递给函数吗?就像我在下面一样。
【问题讨论】:
-
您不能将数组传递给/从 C 中的函数传递。但是您可以传递指向其第一个元素的指针。
我目前通过 spi 发送命令如下:
我想创建一个函数来发送任何传递给它的命令。我可以将字节数组作为参数传递给函数吗?就像我在下面一样。
【问题讨论】:
在 C 中使用指针传递数组。
由于数组可能通过从 T[] 到 T* 的隐式转换衰减指向指针,因此我们将指针传递给引用数组的函数。
把函数写成1
void sendCommand(uint8_t* Cmd) {
...
}
然后这样称呼它
sendCommand(SyncCmd);
但是,请注意:sizeof(Cmd) 在sendCommand 中使用时会产生指针的大小,而不是整个数组。因此,您需要显式传递大小。请参阅 Linus Torvalds 的 this,了解有关此事的一些严厉言论。
1 注意uint8_t[]、uint8_t*、uint8_t[42]和friends在用作参数时都是等价的。也就是说,这些都是等价的:
void foo1(uint8_t*);
void foo2(uint8_t[]);
void foo3(uint8_t[42]);
感谢@Olaf 在这里做出的贡献。
【讨论】:
uint8_t cmd[] 也很好用。更清楚的是在内部用作数组 - 自记录代码。
cmd 怎么办?我更喜欢uint8_t*。但是我会提到它们的等价性,是的。 Linus also has a say regarding this and the kernel,如果你有兴趣。
[] 语法)。作为常数或 VLA。函数标头应记录与 () 结合的参数,例如Doxygen cmets。需要阅读代码才能理解界面是很糟糕的