【问题标题】:Confused on "pass by reference" in C and when to use an & or *对 C 中的“按引用传递”以及何时使用 & 或 * 感到困惑
【发布时间】:2019-09-26 20:52:33
【问题描述】:

我在 C 方面的知识不如我想象的那么好,但是谁能向我解释我在这里做错了什么?我正在使用使用 UARTS(微控制器上的异步接收器发送器)的德州仪器微控制器为嵌入式系统编写程序。我在构建项目时通常会包含 UART 库。

无论如何,这是我的问题:我有 4 个函数只向控制台打印一个字符串并且我的代码编译,但它给我的是警告而不是编译错误。

void foward(unsigned char *command) {
    UARTPutString(UART_BASE, &command);
}

void reverse(unsigned char *command) {
    UARTPutString(UART_BASE, &command);
}

void left(unsigned char *command) {
    UARTPutString(UART_BASE, &command);
}

void right(unsigned char *command) {
    UARTPutString(UART_BASE, &command);
}

我的问题主要与何时使用最简单的指针有关。我之所以使用 char* 命令的指针是因为导入的库是这样写的,但我不知道为什么我们必须使用 char 指针。你把什么作为第二个参数放在:

UARTPutString(UART_BASE, &command);

什么时候使用 & 或 * ?我知道指针指向某个东西的内存地址,但是当我需要使用 *、& 等作为函数的参数时,它不会点击我。

由于某种原因,此警告被提及 21 次:

Description Resource    Path    Location    Type
#169-D argument of type "unsigned char **" is incompatible with parameter of type "unsigned char *" uartconsole.c   /Command_Line_Interface line 82 C/C++ Problem

感谢您的帮助!

【问题讨论】:

  • 为什么你认为你需要通过引用传递这个?这通常只在函数需要修改调用者的变量时使用。
  • 如果函数只是将字符串写入UART,则不需要通过引用传递。
  • UARTPutString() 函数的签名是什么? &command 的类型是 char **,因为 commandchar *
  • 请发布确切的错误信息。
  • C 不支持引用传递,只支持值传递。

标签: c pointers embedded pass-by-reference


【解决方案1】:

UARTPutString() 的第二个参数应该是一个字符串,它是一个 char * 值——字符串是一个指向字符序列的指针。

command 被声明为char *,所以你应该直接传递它。添加&会创建一个指向char **的指针,与char *不兼容。

UARTPutString(UART_BASE, command);

当您需要通过引用传递变量时,您可以在变量前使用&。如果函数需要修改变量的值,通常会这样做。它也可以用于大型结构变量,以避免在将变量传递给函数时对其进行复制。

【讨论】:

    【解决方案2】:

    你需要写:

    UARTPutString(UART_BASE, command);
    

    您的command 是一个指向字符数组的指针(即保存地址的变量)。

    在写&command 时,您使用command 的地址。因此&command 表达式的类型是指针unsigned char ** 的地址,这是编译器所抱怨的。

    因此,该警告告诉您编译器只期望 unsigned char * 作为 UARTPutString() 的第二个参数,这是 command 的类型。

    在 C 中,* 令人困惑的是,它的“含义”取决于使用它的地方。在变量声明中,它说变量是一个指针。在表达式中使用时,例如,如果您要编写 *command = 0;,它会取消引用指针;与在声明中使用 * 时相反。

    关于这个还有很多要说的,我建议你阅读C-FAQ的相关部分。

    祝你好运。 C 是一门非常好的语言,值得努力。

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多