Похоже, вы изобретаете что-то, чего нет в терминах терминологии.
numbers
- это массив.Это автоматический объект типа int[3]
.Его нельзя использовать для формирования адресных констант в C, так как в C адресные константы требуют объектов со статической длительностью хранения.
Если ваш numbers
был объявлен со статической продолжительностью хранения, то это результат массива-указателяпреобразование, примененное к numbers
, будет константой адреса.В этом случае numbers + 1
и &numbers[2]
также будут постоянными адреса.
Вы правильно заметили, что { 1, 2, 3 }
не имеет статической длительности хранения.На самом деле он вообще не имеет срока хранения.Это не объект, а просто кусочек синтаксического сахара под названием агрегатный инициализатор .Если вы хотите, чтобы он стал анонимным объектом, вы должны использовать синтаксис составной литерал : (int[]) { 1, 2, 3 }
, но в любом случае это не сработает.
numbers++
не будет компилироваться просто потому, что результат преобразования массива в указатель не является lvalue.Вы не можете применить ++
к non-lvalue.Является ли что-то постоянным или нет, не имеет значения.
Вы, кажется, делаете странный вывод, что если вы не можете изменить его, это должна быть константа.Это совершенно неверно.В терминологии С свойство быть постоянным имеет очень мало общего со свойством быть модифицируемым .Термин константа относится к значениям, известным в время компиляции .Значения, которые не известны во время компиляции, никогда не называются константами , даже если они не могут быть изменены.Это пример того, что: адрес автоматического массива неизвестен во время компиляции, поэтому, хотя этот адрес не модифицируется, он все равно не является адресной константой .