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