Что возвращают инициализаторы массива?
Что возвращают инициализаторы массива, такие как { '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
На самом деле он ничего не возвращает, он анализирует время компиляции и создает массив. Указатель должен указать на что-то, вы не можете назначить ему прямое значение. Поэтому вам сначала нужен массив, и тогда ваш указатель может указать на него.