const 对字符串文字 C 数组的作用

Role of const for a C array of string literals

我想测试两个 'const' 说明符在以下字符串文字 C 数组初始化中的作用:

const char* const myArray[] = { "one", "two", "three" };

我已经阅读了之前关于 SO 的问题,并了解到 second const 意味着数组的元素不能更改,我将其解释为指针中包含的地址myArray[0] 等不得更改。因此,当此 'const' 存在时,

myArray[0] = "uno"; 

不编译 ("error: assignment of read-only location 'myArray[0]'") 但删除它时赋值工作正常。

然而,我找不到类似的例子来说明上面 first 'const' 的作用,这应该意味着 myArray 的文字本身不能改变(但是他们怎么能改变呢?)。我试过这样的事情:

myArray[0][0] = 'u'; 

当第一个 'const' 出现时我得到一个编译错误 ("error: assignment of read-only location '*(myArray[0])'") 但没有它我得到一个 "run failed" 与 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*。这现在无法更改,因为使用它的许多遗留代码都会中断。