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

标签 c arrays constants string-literals

我想在以下字符串文字 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/

相关文章:

javascript - Rails hide_field 或 JavaScript 数组被发布为逗号分隔的字符串而不是数组

c++ - 返回 const 模板类型的模板函数

c - 排序链表

c - 中缀到前缀和后缀的转换

javascript - 文本框使用键搜索数组并显示最接近的结果

C++:如何从数组生成随机数

c++ - 绕过派生类中 C++ 方法的常量性

c++ - 为什么C++允许从外部修改一个常量对象的指针成员变量的内存?

c - 在c程序中包含tk.h和tcl.h

c - 在 Linux 中的特定 CPU 上运行进程? (不能用命令行指定)