Что возвращают инициализаторы массива?

Что возвращают инициализаторы массива, такие как { 'a', 'b', 'c' }? Я понимаю, что использование инициализатора выделяет смежные блоки памяти и возвращает адрес в первый блок.

Следующий код не работает:

char *char_ptr_1 = { 'a', 'b', 'c', '\0' };

С другой стороны, это работает нормально:

char char_array[] = { 'a', 'b', 'c', '\0' };
char *char_ptr_2 = char_array;

char_array хранит адрес в первом блоке памяти, что объясняет, почему я могу назначить значение char_array на chat_ptr_2. Преобразует ли C значение, возвращаемое инициализатором, в то, что может быть сохранено в указателе?

Я смотрел онлайн и нашел пару ответов, в которых говорилось о различии между массивами и указателями, но они мне не помогли.

Ответ 1

Инициализаторы ничего не возвращают. Они дают указания компилятора о том, что помещать в объявляемый элемент - в этом случае они сообщают компилятору, что помещать в элементы массива.

Вот почему вы не можете назначить инициализатор указателю: инициализатор массива должен быть сопряжен с массивом, чтобы иметь смысл для компилятора.

Указатель может быть инициализирован выражением указателя. Вот почему инициализация в

char *char_ptr_2 = char_array;

: компилятор преобразует char_array в указатель и инициализирует его char_ptr_2.

Ответ 2

он называется инициализатором массива, потому что он инициализирует массив, а не указатель.

Это просто синтаксис C, почему опция указателя не разрешена.

Ответ 3

Они являются инициализаторами массива, а не нормальными выражениями, которые имеют значение. I. e., Инициализатор массива может использоваться только для инициализации массива. Это особый бит синтаксиса для конкретного использования, конец истории.

Ответ 4

На самом деле он ничего не возвращает, он анализирует время компиляции и создает массив. Указатель должен указать на что-то, вы не можете назначить ему прямое значение. Поэтому вам сначала нужен массив, и тогда ваш указатель может указать на него.