Вдохновленный этот вопрос.
Мы можем инициализировать указатель char
строковым литералом:
char *p = "ab";
И это прекрасно. Можно подумать, что это эквивалентно следующему:
char *p = {'a', 'b', '\0'};
Но, по-видимому, это не так. И не только потому, что строковые литералы хранятся в памяти только для чтения, но кажется, что даже через строковый литерал имеет тип массива char
, а инициализатор {...}
имеет тип массива char
, два объявления обрабатываются по-разному, поскольку компилятор дает предупреждение:
предупреждение: избыточные элементы в скалярном инициализаторе
во втором случае. Каково объяснение такого поведения?
Update:
Кроме того, в последнем случае указатель p
будет иметь значение 0x61
(значение первого элемента массива 'a'
) вместо места памяти, так что компилятор, как предупреждал, принимает только первый элемент инициализатора и присвоение ему p
.