Как последний может указывать на отдельные строки?
Когда вы пишете это:
char characters[] = {'h','e','l','l','o'};
вы определяете массив типа char
, т.е. вы определили переменную типа char[5]
. Следовательно, вы можете инициализировать его элементами типа char
.
Напротив, когда вы пишете:
char* characters[] = {"h","e","l","l","o"};
вы определяете массив типа char*
, т.е. вы определили переменную типа char*[5]
- и char*
означает указатель на char
, то есть строка стиля C . Следовательно, вы можете инициализировать его элементами строкового литерала .
Возможно, второй массив лучше назвать strings[]
вместо characters[]
.
Если быть точным, строковые литералы , такие как 'h'
, сами по себе имеют тип const char[2]
1 , что в терминах указателя соответствует const char*
. Таким образом, массив таких строк должен быть определен const char* strings[] = ...
, а не char* strings[] = ...
.
1 const char[2]
, а не const char[1]
, так как он завершается нулем, как в массиве, в котором 1-й элемент равен 'h
, а 2-й - '\0'