Игнорируя ваш код и отвечая на принцип вашего вопроса, см. эту запись в comp.lang.c FAQ: Почему я не могу передать char ** функции, которая ожидает const char **?
Причина, по которой вы не можете присвоить значение
char **
указателюconst char **
, несколько неясна. Учитывая, что квалификаторconst
существует вообще, компилятор хотел бы помочь вам сохранить ваши обещания не изменять значенияconst
. Вот почему вы можете назначитьchar *
дляconst char *
, но не наоборот: явно безопасно «добавить»const
-ness к простому указателю, но было бы опасно его убрать. Однако предположим, что вы выполнили следующую более сложную серию заданий:const char c = 'x'; /* 1 */ char *p1; /* 2 */ const char **p2 = &p1; /* 3 */ *p2 = &c; /* 4 */ *p1 = 'X'; /* 5 */
В строке 3 мы присваиваем
blockquote>char **
const char **
. (Компилятор должен жаловаться.) В строке 4 мы присваиваемconst char *
const char *
; это явно легально. В строке 5 мы модифицируем то, что указываетchar *
- это должно быть законным. Однакоp1
заканчивается, указывая наc
, который являетсяconst
. Это произошло в строке 4, потому что*p2
был действительноp1
. Это было установлено в строке 3, которая является назначением формы, которая запрещена, и именно поэтому строка 3 запрещена.И как ваш вопрос помечен как C ++, а не C, он даже объясняет, что использовать следующие
const
квалификаторы:(C ++ имеет более сложные правила для назначения указателей со знаком const, которые позволяют вам делать больше видов назначений без каких-либо предупреждений, но все же защищать от непреднамеренных попыток изменения значений const. C ++ все же не позволил бы присвоить
blockquote>char **
const char **
, но это позволило бы вам уйти с назначениемchar **
вconst char * const *
.)