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

时间:2015-02-01 14:43:09

标签: c arrays const elements

我阅读了所有我能想到的所有内容和#34;编译时间常数"在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]只读/ const,同时它声明testArray [0]不是常量! 我确实回答了自己"显然,解除引用操作符[]在编译时不能正常工作"常量初始化,那么为什么这些行会编译而没有错误?

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

另请注意,我在这里获取数组中第二项的地址。因此"编译时间"恒定初始化可以取消引用没有问题!
对此有何解释?

1 个答案:

答案 0 :(得分:4)

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

  • 算术常量表达式:它只能包含整数/枚举/字符/浮点常量和sizeof表达式的操作数。它们可能不会引用其他变量的值。
  • 空指针常量。
  • 地址常量,可选地添加到整数常量表达式中。此地址常量可以为null,指向函数,或指向具有静态存储持续时间的对象。只要您没有引用对象的值,该标准就允许使用[]&等运算符。

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

参考:C99标准,第6.6节。