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

标签 c arrays constants element

我阅读了有关 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] 是只读/常量,同时它声明 testArray[0] 不是常量! 我确实回答自己“显然解引用运算符 [ ] 无法在“编译时”常量初始化上工作,那么为什么这行代码编译时不会出现错误?

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

还请注意,这里我获取了数组中第二项的地址。因此“编译时”常量初始化可以毫无问题地取消引用!
对此有何解释?

最佳答案

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

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

在本例中,由于引用了另一个变量中存储的值,因此 testArray[1] 不是常量表达式,但 &testArray[1] 是地址常量and 是一个有效的常量表达式。

引用:C99 标准,第 6.6 节。

关于C const 数组元素不是真正的 const 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28263911/

相关文章:

java - 在 Java 中对数组进行排序并处理任何空值

c++ - c++ 'pass by reference if possible' 可以吗?

c - C 中的字符串问题

c - 文件字符串结束符

c# - 从 C# 将指针到指针传递给 C++ 类库

java - 在java中的数组和数组列表中搜索自定义对象

java - Java中二维数组的分割和转置

c - 线程。如何检查互斥体是否已锁定

c++ - 常量 std::string 会复制它初始化的数据吗?

dart - Dart const类参数检查