Назначить список char*

char

Объясните на простом примере. Как передать char* в функцию?

#define name1 "ABCD"
#define name2 "EFGH"
#define name3 "HIJK"

char *list[3] = {};

void printList(char *l, int x) {
  for (int i = 0; i < x; i++) {
    Serial.println(l[i]);
  }

}



void setup() {
  // поместите сюда код установки для однократного запуска:
  Serial.begin(115200);
  Serial.println("start");
  list[0] = name1;
  list[1] = name2;
  list[2] = name3;

  printList(list, 3);

}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:

}

Я получаю сообщение об ошибке:

/home/guy/Documents/Dropbox/Arduino/sketch_jun12a/sketch_jun12a.ino: In function 'void setup()':
sketch_jun12a:24:13: error: cannot convert 'char**' to 'char*'
   24 |   printList(list, 3);
      |             ^~~~
      |             |
      |             char**
/home/guy/Documents/Dropbox/Arduino/sketch_jun12a/sketch_jun12a.ino:7:22: note:   initializing argument 1 of 'void printList(char*, int)'
    7 | void printList(char *l, int x) {
      |                ~~~~~~^
exit status 1
cannot convert 'char**' to 'char*'

, 👍1

Обсуждение

Вы пытаетесь передать массив char * функции, которая ожидает один char *., @Majenko

@Majenko AFAIK в любом случае вы передаете только указатель на первую ячейку массива, или я ошибаюсь?, @Guy . D


1 ответ


Лучший ответ:

7

Просто измените это:

void printList(char *l, int x) {

к этому:

void printList(char **l, int x) {

Хорошо, это заслуживает некоторого объяснения...

В C и C++, когда вы используете (а не когда вы определяете) массив идентификатор, он распадается до указателя на его первый элемент. В в этом случае

char *list[3] = {};

является массивом указателей на char. Когда вы используете его здесь:

printList(list, 3);

он распадается на указатель на указатель на char. Таким образом, требуется двойной в объявлении параметра.

Примечание: чтобы получить действительно правильный C++, вы должны заменить каждый экземпляр char с помощью const char. Это связано с тем, что символ в вопрос относится к строковым литералам, и вам не разрешено изменять строковый литерал во время выполнения.

,