【问题标题】:Why pass by pointer to a C function? [duplicate]为什么要通过指针传递给 C 函数? [复制]
【发布时间】:2020-11-16 06:59:35
【问题描述】:

我看到一些代码通过指针传递一些结构到一个不会改变指针指向的值的函数,比如这个:

typedef struct __spi_handle_t {
    uint16_t  TxXferSize;  /* SPI Tx transfer size */
    uint16_t  RxXferSize;  /* SPI Rx transfer size */
    uint16_t  RxXferCount; /* SPI Rx Transfer Counter */
} spi_handle_t;

void hal_spi_init(spi_handle_t *spi_handle);

这样做的意义何在,而不仅仅是按值传递?

【问题讨论】:

  • C中没有引用传递,只有值和指针传递
  • @kaylum 是的,谢谢
  • @Jorengararar 传递“按指针”是按值传递...
  • @e2-e4 通过引用传递也是如此。当然是按值传递,因为你需要传递指针值,但它不是你想要操作的实际值。您使用中间人(指针)来传递实际数据,因此称为指针传递。
  • @Jorengarenar:在讨论 C 时,“按引用传递”意味着按指针传递。这是 C++ 创建引用类型之前的长期用法,当 C++ 使用这个词时,它在 C 中并没有变得不正确。 C 标准使用“引用”来表示通过指针引用对象的行为;见我的comments below

标签: c pointers parameter-passing pass-by-reference


【解决方案1】:

结构可能非常大,因此尝试按值传递它们可能会导致效率低下。

通过将指针传递给结构,它将开销减少到仅单个指针。

【讨论】:

  • “效率低下”是什么意思?
  • @AhmedAbdalrahiem 结构的大小可以是几千字节甚至几兆字节。按值传递大型结构意味着复制所有数据。
  • @AhmedAbdalrahiem 因此,约定是将指向结构的指针传递给函数,除非它非常小。
  • @dbush:48 字节没那么大。这不是在这种情况下使用指针的原因。
【解决方案2】:

那么,这样做的意义何在,而不仅仅是按值传递?

hal_spi_init 中的代码实际上是通过指针而不是引用传递。在 C 中没有引用类型。

传递指针(而不是按值传递)的要点是避免昂贵的复制。在这种情况下,这并不重要,因为 spi_handle_t 非常小。但是如果spi_handle_t 是一个巨大的结构,那将是一个很大的区别。

同时传递指针将允许直接在 hal_spi_init 内更改原始结构 - 无法传递值(即从调用者更改原始结构)。

【讨论】:

  • 我看到在大多数情况下,这对于通过指针传递而不是通过值传递很有用。那么,什么时候决定是传值还是传指针呢?
  • @CherryDT 没错,正在输入它..
  • @AhmedAbdalrahiem 您应该传递基本/小型数据类型的值,即intbool 类型。大多数其他情况下,传递指针是 C 语言的方式。
  • 这个约定背后有什么意义吗,先生? @artm
  • Re “not reference”:这是对用于 C 的术语的尝试追溯更改,并且答案不应该责备用户使用它,尤其不应该引导它。在 C++ 做出一些它称为“引用”的东西之前,这个术语的意思是,现在仍然是指一种为某物提供某种句柄或地址的方式。指针是引用,指针传递就是引用传递。 C 标准在一个地方引用一个引用数组的指针,在另一个地方引用一个通过指针引用的对象。在 7.29.6 中,它指的是通过指针传递的“引用对象”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多