char *c = "line";
равно , а не так же, как
char c[] = "line";
, это действительно то же самое, что
static char hidden_C0[] = "line";
char *c = hidden_C0;
, за исключением того, что переменная hidden_C0
не является прямойдоступны.Но вы увидите это, если сбросите сгенерированный ассемблер (обычно он имеет имя, которое не является допустимым идентификатором C, например .LC0
).И в вашем примере с массивом строковых констант происходит то же самое:
char *choices[] = { "New Game", "Continue Game", "Exit" };
становится
char hidden_C0[] = "New Game";
char hidden_C1[] = "Continue Game";
char hidden_C2[] = "Exit";
char *choices[] = { hidden_C0, hidden_C1, hidden_C2 };
Теперь это поведение особого случая, которое доступно только для строковых констант.Вы не можете написать
int *numbers = { 1, 2, 3 };
, вы должны написать
int numbers[] = { 1, 2, 3 };
, и поэтому вы не можете написать
char **choices = { "a", "b", "c" };
.
(Ваше заблуждение является частным случаем распространенного заблуждения о том, что массивы "совпадают с" указателями в C. Они не являются. Массивы являются массивами. Переменные с типами массивов страдают затуханием типа от типа указателя, когда они используется (почти во всех контекстах), но не тогда, когда они определены. *