对 C 中的 "pass by reference" 以及何时使用 & 或 * 感到困惑
Confused on "pass by reference" in C and when to use an & or *
我对 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
感谢帮助!
你需要写:
UARTPutString(UART_BASE, command);
您的 command
是指向字符数组的指针(即保存地址的变量)。
当写 &command
时,您使用 command
的地址。因此,&command
表达式的类型是指针 unsigned char **
的地址,这是编译器所抱怨的。
所以那个警告告诉你编译器只期望 unsigned char *
作为 UARTPutString()
的第二个参数,这是 command
.
的类型
C 中的 *
令人困惑的是它的 'meaning' 取决于它的使用位置。在变量声明中,它表示该变量是一个指针。在表达式中使用时,例如,如果您写 *command = 0;
,它会取消引用指针;与在声明中使用 *
时相反。
关于这个还有很多要说的,我建议你阅读 C-FAQ.
的相关部分
祝你好运。 C 是一种非常好的语言,值得为之付出努力。
UARTPutString()
的第二个参数应该是一个字符串,它是一个 char *
值 -- 字符串是指向字符序列的指针。
command
被声明为 char *
,所以你应该直接传递它。添加 &
创建一个指向指针的指针,它是 char **
,并且与 char *
.
不兼容
UARTPutString(UART_BASE, command);
当您需要通过引用传递变量时,您可以在变量前使用 &
。如果函数需要修改变量的值,通常会这样做。它也可以用于大型结构变量,以避免在将变量传递给函数时复制变量。
我对 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
感谢帮助!
你需要写:
UARTPutString(UART_BASE, command);
您的 command
是指向字符数组的指针(即保存地址的变量)。
当写 &command
时,您使用 command
的地址。因此,&command
表达式的类型是指针 unsigned char **
的地址,这是编译器所抱怨的。
所以那个警告告诉你编译器只期望 unsigned char *
作为 UARTPutString()
的第二个参数,这是 command
.
C 中的 *
令人困惑的是它的 'meaning' 取决于它的使用位置。在变量声明中,它表示该变量是一个指针。在表达式中使用时,例如,如果您写 *command = 0;
,它会取消引用指针;与在声明中使用 *
时相反。
关于这个还有很多要说的,我建议你阅读 C-FAQ.
的相关部分祝你好运。 C 是一种非常好的语言,值得为之付出努力。
UARTPutString()
的第二个参数应该是一个字符串,它是一个 char *
值 -- 字符串是指向字符序列的指针。
command
被声明为 char *
,所以你应该直接传递它。添加 &
创建一个指向指针的指针,它是 char **
,并且与 char *
.
UARTPutString(UART_BASE, command);
当您需要通过引用传递变量时,您可以在变量前使用 &
。如果函数需要修改变量的值,通常会这样做。它也可以用于大型结构变量,以避免在将变量传递给函数时复制变量。