Инициализация массива строк

Это продолжение другого question.

Рассмотрим следующий код:

char *hi = "hello";

char *array1[3] = 
{
    hi,
    "world",
    "there."
};

Он не компилируется до моего удивления (видимо, я не знаю синтаксиса Си, как я думал), и генерирует следующую ошибку:

  error: initializer element is not constant

Если я изменю char * на char [], он компилирует fine:

char hi[] = "hello";

char *array1[3] = 
{
    hi,
    "world",
    "there."
};

Может кто-нибудь объяснить мне, почему?

Ответ 1

В первом примере (char *hi = "hello";) вы создаете неконстантный указатель, который инициализируется, чтобы указать на статическую константную строку "привет". Этот указатель мог бы теоретически указать на что угодно.

Во втором примере (char hi[] = "hello";) вы конкретно определяете массив, а не указатель, поэтому адрес, который он ссылается, не модифицируется. Обратите внимание, что массив можно рассматривать как немодифицируемый указатель на определенный блок памяти.

Ваш первый пример фактически компилируется без проблем в С++ (мой компилятор, по крайней мере).