我想在以下字符串文字 C 数组的初始化中测试两个“const”说明符的作用:
const char* const myArray[] = { "one", "two", "three" };
我已经阅读了之前关于 SO 的问题,并且理解 second const 意味着数组的元素不能更改,我将其解释为指针 myArray[0] 中包含的地址,等等,不得改变。所以,当这个“常量”存在时,
myArray[0] = "uno";
不编译(“错误:分配只读位置'myArray[0]'”)但是当删除它时分配工作正常。
但是,我找不到一个类似的例子来说明上面 first 'const' 的作用,这应该意味着 myArray 的文字本身不能被改变(但它们怎么能改变呢?) .我试过这样的事情:
myArray[0][0] = 'u';
当第一个 'const' 出现时,我得到一个编译错误(“错误:分配只读位置 '*(myArray[0])'”)但没有它我得到一个 NetBeans 的“运行失败”和 MinGW。
有人可以为上面第一个“const”的作用提供一个更好的例子吗?非常感谢。
最佳答案
您的声明 const char* const myArray[]
扩展为 -
an array of constant pointer to const characters
这意味着,它是一个常量指针数组,因此一旦初始化就不能更改。而且它指向的字符也是常量,这意味着您可以取消引用指针以仅读取字符而不能覆盖它们。
这个数组被初始化为包含三个字符串"one"
、"two"
和"three"
的数组。
所以像这样的操作
myArray[i] = ...;
*myArray[i] = ...;
会失败,但是像-
这样的操作otherArray = myArray[i];
char t = *myArray[i];
会好的。
这也是为什么像 myArray[0] = "uno"
这样的代码无法编译的原因。
您正在尝试将新字符串分配给 myArray[0]
,但它被声明为 const
(const
在 *
导致这个之后)。
现在回答您关于 myArray[0][0] = 'u';
的问题。即使您删除了第一个 const
,字符串文字在默认情况下也是 const
。您不能更改它们包含的字符。编译器不会提示赋值,因为它不知道 myArray[0]
指向常量字符串。
这是 C 标准的一个问题,字符串文字的类型为 char*
而不是 const char*
。这现在无法更改,因为使用它的许多遗留代码都会中断。
关于c - const 对字符串文字 C 数组的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406148/