Строковый литерал не является указателем. Строковый литерал является массивом символов. Итак, в вашем примере это array = array
инициализация , а не array = pointer
, как вы, кажется, верите.
Тем не менее в общем случае инициализация одного массива другим массивом, как на C, так и на C ++, действительно запрещена.
Однако и в C, и в C ++ есть одно исключение из этого правила: символьные массивы можно инициализировать строковыми литералами. (Примечание: инициализация разрешена; назначение не будет работать). Каждый элемент массива инициализируется с соответствующим символом из литерала (который также неявно включает завершающий нулевой символ в конце). В C ++ требуется, чтобы размер массива получателя имел достаточно места для завершающего нуля. В C допускается «выпадение» в конце нуля, если в массиве получателей не хватает одного символа.
Кроме того, вам не требуется явно указывать размер массива. Вы можете сделать
char arr[] = "Abc";
и компилятор автоматически определит, что вам нужен массив из 4 элементов.