You seem to be inventing something that does not really exist, terminology.
numbers is an array. This is an automatic object of type int[3] . It cannot be used to form address constants in C, because objects with static storage duration are required in address constant C.
If your numbers were declared with a static storage duration, then the result of converting the array to pointer conversion applied to numbers will be a constant address. numbers + 1 , as well as &numbers[2] will also be a permanent address in this case.
You have the right to notice that { 1, 2, 3 } does not have a static storage duration. In fact, it does not have a shelf life at all. This is not an object, but just a piece of syntactic sugar called an aggregate initializer. If you want it to become an anonymous object, you will have to use the syntax of the compound literal: (int[]) { 1, 2, 3 } , but it will not work in the above context.
numbers++ will not compile simply because the result of the conversion between arrays and pointers is not an lvalue value. You cannot apply ++ to non-lvalue. Whether it is constant or not does not matter.
You seem to be making the strange conclusion that if you cannot change it, it must be a constant. This is completely untrue. In C terminology, the property of being constant has very little to do with the fact that it can be modifiable. The term constant refers to values โโthat are known at compile time. Values โโthat are not known at compile time are never called constants, even if they are not changed. This is an example of this: the address of an automatic array is unknown at compile time, therefore, although this address is not modified, it is still not an address constant.
source share