C const 数组元素不是真的const 吗?

C const array elements are not really const?

关于 "compile time constants" 在 C 中,我尽我所能阅读了所有内容,但我还不能对以下内容做出解释:

const short testArray[2]={1,2};
//void IndeedConst(void){ testArray[0]=3; } //correctly reports "error: assignment of read-only location 'testArray[0]'"
const short testItem=testArray[0]; //why "error: initializer element is not constant"??

所以编译器抱怨 testArray[0] 被读取 only/const,同时它声明 testArray[0] 不是常量! 我确实在编译时回答了自己 "evidently the dereferencing operator [ ] cannot work " 常量初始化,那么为什么这些行可以编译而没有错误?

const short* testItem=&(testArray[1]);

另请注意,这里我获取的是数组中第二项的地址。因此 "compile time" 常量初始化 可以 取消引用没有问题!
对此有何解释?

对于具有静态存储持续时间的变量,初始化器必须由常量表达式组成。其中包括:

  • 算术常量表达式:这只能有 integer/enum/character/floating 常量和 sizeof 表达式的操作数。它们可能不引用其他变量的值。
  • 空指针常量。
  • 地址常量,可选择添加到整数常量表达式。这个地址常量可以为空,指向一个函数,或者指向一个具有静态存储持续时间的对象。只要您不引用对象的值,该标准就允许使用 []& 等运算符。

在这种情况下,testArray[1]不是常量表达式,因为它引用存储在另一个变量中的值,但&testArray[1]是一个地址常量,是一个有效的常量表达式。

参考:C99 标准,第 6.6 节。