混淆了C中的“引用传递”以及何时使用&或*

问题描述 投票:0回答:2

我不像以前那样了解C语言,但是有人可以向我解释我在这里做错了什么吗?我正在编写使用德克萨斯州仪器(TI)微控制器和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

感谢您的帮助!

c pointers embedded pass-by-reference
2个回答
0
投票

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

command被声明为char *,因此您应该直接将其传递。添加&会创建一个指向char **的指针,该指针与char *不兼容。

UARTPutString(UART_BASE, command);

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


0
投票

您需要写:

UARTPutString(UART_BASE, command);

您的command是一个指向字符数组的指针,IAW一个地址。

[写入&command时,将使用command的地址。 &command表达式的类型是unsigned char **,这是编译器抱怨的。

因此警告告诉您编译器仅将unsigned char *作为UARTPutString()的第二个参数,它是command的类型。

[C中的*令人困惑的是,它的“含义”取决于它的使用位置。在变量/参数定义中,它表示变量/参数是指针。在表达式中使用时,例如,如果您要编写*command = 0;,它将取消引用指针,因此相反。

还有很多话要说,我建议您阅读C-FAQ的相关部分。

祝你好运。 C是一种非常不错的语言,值得付出努力。

© www.soinside.com 2019 - 2024. All rights reserved.