Ваше объявление const char* const myArray[]
расширяется до -
массив константного указателя на постоянные символы
Это означает, что это массив указателей, которые являются постоянными,поэтому не может быть изменено после инициализации.И символы, на которые он указывает, также являются постоянными, то есть вы можете разыменовать указатель, чтобы только читать символы, но не могли их перезаписать.
Этот массив инициализируется в массив, содержащий три строки "one"
, "two"
и "three"
.
Таким образом, такие операции, как
myArray[i] = ...;
*myArray[i] = ...;
, не будут выполнены, но такие операции, как -
otherArray = myArray[i];
char t = *myArray[i];
, будут в порядке.
Это также причина, по которой код, подобный myArray[0] = "uno"
, не компилируется.
Вы пытаетесь назначить новую строку для myArray[0]
, но она объявлена как const
(const
, который следует после *
, вызывает это).
Теперь перейдем к вашему вопросу о myArray[0][0] = 'u';
.Даже если вы удалите первые const
, строковые литералы будут по умолчанию const
.Вы не можете изменить символы, которые они содержат.Компилятор не жалуется на присваивание, потому что он не знает, что myArray[0]
указывает на постоянную строку.
Это проблема со стандартом C, что строковые литералы имеют тип char*
, а не const char*
.Это не может быть изменено сейчас, потому что много устаревшего кода, который использует это, сломается.