Это может помочь просмотреть типы каждого массива. Помните, что в большинстве случаев тип выражения массива неявно преобразуется (разлагается) из N-element array of T
в pointer to T
или T *
1 . В случаях data_set1, data_set2 и data_set3, T
равен char *
, поэтому выражение data_set1
неявно преобразуется из 4-element array of char *
в pointer to char *
или char **
. То же самое верно и для двух других массивов, как показано в таблице ниже:
Array Type Decays to
----- ---- ---------
data_set1 char *[4] char **
data_set2 char *[5] char **
data_set3 char *[6] char **
Если вы создаете массив этих выражений (что вы, похоже, пытаетесь сделать), тогда объявление массива должно быть
char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};
что дает нам
Array Type Decays to
----- ---- ---------
ptr_char char **[4] char ***
Таким образом, ptr_char - это массив указателей на указатели на char или char **ptr_char[4]
. Когда вы передаете ptr_char
аргумент в функцию отображения, он снова неявно преобразуется из типа 4-element array of char **
в pointer to char **
или char ***
.
1. Исключениями из этого правила являются случаи, когда выражение массива является операндом операторов
sizeof
или
&
(address-of), или если выражение является строковым литералом, используемым для инициализации другого массива в объявлении.