gpt4 book ai didi

C 中的常量数组

转载 作者:太空狗 更新时间:2023-10-29 16:43:39 25 4
gpt4 key购买 nike

原问题:如果我定义:

const int z[5] = {10, 11, 12, 13, 14}; 

这是否意味着:

  1. 它是一个常量整数数组,即 z 指向的地址始终是常量,永远不会改变,但 z 的元素可以改变。

  1. 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 的所有元素都是常量,这是否有效?

最佳答案

表示z的每个元素都是只读的。

对象z是一个数组对象,不是指针对象;它没有指向任何东西。与任何对象一样,z 的地址在其生命周期内不会改变。

因为对象 z 是一个数组,表达式 z 在大多数情况下,但不是所有情况下,隐式转换为指针表达式,指向 z[0]。该地址与整个数组对象 z 的地址一样,在对象的生命周期内不会改变。这种“转换”是对表达式含义的编译时调整,而不是运行时类型转换。

要了解数组和指针之间的(通常令人困惑的)关系,请阅读 comp.lang.c FAQ 的第 6 节.

了解“常量”和 const 是两个不同的东西很重要。

如果某物是常量,它会在编译时求值;例如,42(2+2)常量表达式

如果一个对象是用 const 关键字定义的,这意味着它是只读的,而不是(必须)是常量。这意味着您不能尝试通过其名称修改对象,并且尝试通过其他方式修改它(例如,通过获取其地址并强制转换为非常量指针)具有未定义的行为。例如,请注意:

const int r = rand();

有效。 r 是只读的,但它的值直到运行时才能确定。

关于C 中的常量数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32705419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com