Как массив const может содержать только символы в каждом элементе, а массив char * может указывать на строки в каждом элементе? - PullRequest
0 голосов
/ 30 августа 2018
char characters[] = {'h','e','l','l','o'};


char* characters[] = {"h","e","l","l","o"};

Как последний может указывать на отдельные строки?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Из-за разных типов. В первом примере у вас есть массив символов, во втором - массив указателей на символы (массив массивов, если хотите). Строковые литералы имеют тип const char[], что означает const char*. Во втором примере у вас должен быть квалификатор const:

const char* characters[] = {"h","e","l","l","o"};

Так получилось, что у ваших строковых литералов есть один символ, за которым следует скрытый нулевой завершающий символ. Так что, если у вас было:

const char test[] = "h";

что у вас есть на самом деле:

const char test[] =  {'h', '\0'};

Добавьте указатель на приведенный выше пример, и у вас будет массив массивов символов с нулевым символом в конце. Чтобы сделать вещи более понятными, вы также можете иметь:

const char* characters[] = {"hello","world","etc"};

Предпочитайте std :: string вышеописанному подходу, поскольку он делает всю тяжелую работу за вас.

0 голосов
/ 30 августа 2018

Как последний может указывать на отдельные строки?

Когда вы пишете это:

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'

...