我不像以前那样了解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
感谢您的帮助!
UARTPutString()
的第二个参数应该是一个字符串,它是一个char *
值-字符串是一个指向字符序列的指针。
command
被声明为char *
,因此您应该直接将其传递。添加&
会创建一个指向char **
的指针,该指针与char *
不兼容。
UARTPutString(UART_BASE, command);
当需要通过引用传递变量时,请在变量前使用&
。如果函数需要修改变量的值,通常可以这样做。它也可以用于大型结构变量,以避免在将变量传递给函数时对其进行复制。
您需要写:
UARTPutString(UART_BASE, command);
您的command
是一个指向字符数组的指针,IAW一个地址。
[写入&command
时,将使用command
的地址。 &command
表达式的类型是unsigned char **
,这是编译器抱怨的。
因此警告告诉您编译器仅将unsigned char *
作为UARTPutString()
的第二个参数,它是command
的类型。
[C中的*
令人困惑的是,它的“含义”取决于它的使用位置。在变量/参数定义中,它表示变量/参数是指针。在表达式中使用时,例如,如果您要编写*command = 0;
,它将取消引用指针,因此相反。
还有很多话要说,我建议您阅读C-FAQ的相关部分。
祝你好运。 C是一种非常不错的语言,值得付出努力。