Почему нет неизменяемого набора ints, в то время как неизменяемый набор символов возможен?
char *str = "Hey baby";
создает память для строки и точки str. Если это действительно, почему бы не следующее:
int *x = {7, 0, 1};
Это должно сделать то же самое, кроме как int вместо char s.
Ответ 1
Существует "неизменяемый набор ints", он выглядит так:
(const int[]){7, 0, 1}
Собственная терминология является составной буквальной. Вы можете указать на это:
const int *ptr = (const int[]){7, 0, 1};
По историческим причинам строковые литералы не имеют типа const, несмотря на неизменность. Но рекомендуется использовать const char * для указания на них, чтобы компилятор обнаружил, когда вы пытаетесь записать его.
Компонентные литералы с типом const могут быть "свернуты" таким же образом, что и строковые литералы, т.е. могут перекрываться с другими такими составными литералами. Неконсолидные составные литералы имеют уникальные адреса и могут быть записаны.
Ответ 2
Почему нет неизменяемого набора int в неизменяемом наборе символов?
Причина в том, что утверждения типа
int *x = {7, 0, 1};
является нарушением ограничения. Это зависит от компилятора, как он справляется с этим.
5.1.1.3 Диагностика (P1):
Соответствующая реализация должна выдавать, по меньшей мере, одно диагностическое сообщение (идентифицированное определенным образом), если блок трансляции или блок перевода содержит нарушение любого синтаксического правила или ограничения, даже если поведение также явно указано как undefined или определенный реализацией
В большинстве случаев компилятор не выдаёт никакого предупреждения, если флаги -pedantic -Wall -Wextra не используются для компиляции. В этой неправильной инициализации сообщается об ошибке в GCC.
Неизменяемые наборы int могут быть созданы с помощью const qualifier как