Смущает «передача по ссылке» в C и когда использовать & или * - PullRequest
0 голосов
/ 26 сентября 2019

Я не настолько хорошо осведомлен в Си, как я думал, но кто-нибудь может объяснить мне, что я здесь делаю неправильно?Я пишу программу для встроенной системы с использованием микроконтроллера Texas Instruments с использованием 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 *, заключается в том, что импортированная библиотека была написана таким образом, но я понятия не имею, почему мы должны использовать указатель на символ.И что вы указали в качестве второго аргумента в:

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

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Второй аргумент UARTPutString() должен быть строкой, которая является значением char * - строка является указателем на последовательность символов.

command объявляется какchar *, так что вы должны просто передать это напрямую.Добавление & создает указатель на указатель, который является char ** и несовместим с char *.

UARTPutString(UART_BASE, command);

. Вы используете & перед переменной, когда вам нужно передать переменную по ссылке,Обычно это делается, если функции необходимо изменить значение переменной.Он также может использоваться для больших структурных переменных, чтобы избежать копирования переменной при передаче ее функции.

1 голос
/ 27 сентября 2019

Вам необходимо написать:

UARTPutString(UART_BASE, command);

Ваш command является указателем (т. Е. Переменной, содержащей адрес) на массив символов.

При записи &command вывозьмите адрес command.Следовательно, тип выражения &command - это адрес указателя unsigned char **, на который жалуется компилятор.

Так что это предупреждение говорит вам, что компилятор ожидает только unsigned char * какВторой аргумент UARTPutString(), который является типом command.

В * в C запутано то, что его «значение» зависит от места, где он используется.В объявлении переменной говорится, что переменная является указателем.При использовании в выражении, например, если вы напишите *command = 0;, оно разыменовывает указатель;обратное тому, когда * используется в объявлении.

Об этом можно сказать гораздо больше, и я предлагаю вам прочитать соответствующие разделы C-FAQ .

Удачи.С - очень хороший язык, и стоит приложить усилия.

...