【问题标题】:when to use pointers in function arguments in c, UART function [closed]何时在 c、UART 函数的函数参数中使用指针[关闭]
【发布时间】:2016-01-18 11:41:19
【问题描述】:

我正在阅读一些微控制器上的 uart 示例代码。

在 uart 库的头文件中有以下函数定义。

然后在主程序中调用以下代码。

我的问题是为什么他们使用指针作为函数参数?

或者,下面的 UART 写函数声明不使用指针。

我只是想知道为什么以及何时使用指针。

非常感谢

【问题讨论】:

  • 你需要一本c 的书。这对 SO 来说非常广泛。
  • 您的替代方案每次调用只能写入一个字节。没关系,它不会很快。设备驱动程序调用通常会产生大量开销,您需要为每个单独的调用付费。尽管这对于微控制器来说通常不是什么大问题。您需要一个指针和一个计数才能在每次调用时写入多个字节。
  • 对大家有帮助,非常感谢

标签: c pointers uart


【解决方案1】:

简单地说,您必须使用指针,因为ti_uart_write_buffer 发送一个数据数组。

出于性能原因,无法将数组按值传递给 C 函数。因为这样做会涉及复制数据,这会浪费执行时间和内存。所以这在 C 语言本身是不可能的。

相反,您可以将指针传递给数组的第一个元素。

【讨论】:

  • 打个比方:您拥有一家汽车店,您希望雇人清洁所有汽车。然后你会把店里的每一辆车都开到他家让他清洗,还是你会把车店的地址告诉他去那里工作?
【解决方案2】:

在主函数中,BANNER 被转换为 uint8_t*,因为它是一个字符串字面量,因此具有类型 const char[],当在表达式中使用或作为函数传递时衰减为 const char*charuint8_t 是不同的类型,尽管它们的表示是相同的,只是某些值的解释不同。

main 函数还有另一个问题:您应该传递 strlen(BANNER) 而不是 sizeof(BANNER),以免在要传输的字节数中包含空终止符。

这是一个更正的版本:

#define BANNER  "Hello, world!\n\n"

int main(void) {
    ti_uart_write_buffer(TI_UART_0, (const uint8_t *)BANNER, strlen(BANNER));
    return 0;
}

【讨论】:

    【解决方案3】:

    在函数描述中可以看出它是一个多字节数据写入函数。因此,当您想要写入多个字节时,您会发送一个指向该数据的指针。 另一方面,如果你只想写一个字节,使用只取一个字节的函数,它是按值传递的。

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2020-09-17
      • 2022-01-20
      • 2013-03-31
      • 2016-09-07
      相关资源
      最近更新 更多