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*
。这现在无法更改,因为使用它的许多遗留代码都会中断。
我想测试两个 '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*
。这现在无法更改,因为使用它的许多遗留代码都会中断。