【发布时间】:2015-12-18 18:07:25
【问题描述】:
原问题: 如果我定义:
const int z[5] = {10, 11, 12, 13, 14};
是什么意思:
- 它是一个常量数组,即 z 指向的地址始终是常量并且永远不会改变,但 z 的元素可以改变。
或
- z 的每个元素都是一个常数,即它们的值永远不会改变。
编辑:
更多信息:
还有一个变量:
const int *y = z;
func((int *) y);
其中 func 定义为:
void func(int y[]) {
int i;
for(i = 0; i < 5; i++) {
y[i] = i; //y[i] can be set to any integer; used i as example
}
}
在 func 中,使用 y 遍历数组并更改每个元素。即使 z 的所有元素都是 const,这是否有效?
【问题讨论】:
-
您尝试更改
z[0]吗? -
z指向的地址无论如何都不会改变。在任何情况下,您都可以使用cdecl.org -
这没有意义。鉴于该声明,任何修改
z[0]的尝试都应该被编译器拒绝。请用一个完整的独立示例来更新您的问题,以证明这一点。 -
@juanchopanza:这值得怀疑。 OP更有可能在某个地方犯了错误。
-
您没有收到编译器警告,因为您将
y的值转换为int*。您是在告诉编译器假装y指向非const数据。因为事实上y指向const数据,所以你对编译器撒了谎,你的代码有未定义的行为。通常应该避免强制转换,尤其是指针强制转换。