char string[] = "hello world";
Эта строка инициализирует string
как достаточно большой массив символов (в данном случае char[12]
). Он копирует эти символы в ваш локальный массив, как если бы вы написали
char string[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0' };
Другая строка:
char* string = "hello world";
не инициализирует локальный массив, а просто инициализирует локальный указатель. Компилятору разрешено устанавливать его как указатель на массив, который нельзя изменять, как если бы код был
const char literal_string[] = "hello world";
char* string = (char*) literal_string;
Причина, по которой C позволяет это без приведения типов, в основном состоит в том, чтобы позволить древнему коду продолжить компиляцию. Вы должны представить, что тип строкового литерала в вашем исходном коде - const char[]
, который может преобразовывать в const char*
, но никогда не преобразовывать его в char*
.
person
aschepler
schedule
03.11.2010