【问题标题】:passing array as function argument c将数组作为函数参数传递 c
【发布时间】:2016-06-12 12:10:29
【问题描述】:

我目前通过 spi 发送命令如下:

我想创建一个函数来发送任何传递给它的命令。我可以将字节数组作为参数传递给函数吗?就像我在下面一样。

【问题讨论】:

  • 您不能将数组传递给/从 C 中的函数传递。但是您可以传递指向其第一个元素的指针。

标签: c arrays arguments


【解决方案1】:

在 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[] 也很好用。更清楚的是在内部用作数组 - 自记录代码。
  • @Olaf 嗯,这就是你的看法。在阅读周围的代码时,指针引用数组的事实也应该很明显。另外,如果有人真的只传递了一个大小为 1 的元素 cmd 怎么办?我更喜欢uint8_t*。但是我会提到它们的等价性,是的。 Linus also has a say regarding this and the kernel,如果你有兴趣。
  • 我现在读了 Linus 的咆哮。我完全同意他的观点,人们应该学习和了解 C。但这意味着他们知道形式化的数组参数转换。他们已经必须知道实际的数组参数衰减为指针,因此格式参数衰减也应该很清楚。如果您依赖数组参数的特定大小,则必须传递该大小(可能主要问题是[] 语法)。作为常数或 VLA。函数标头应记录与 () 结合的参数,例如Doxygen cmets。需要阅读代码才能理解界面是很糟糕的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2021-02-23
相关资源
最近更新 更多