维基百科说“const”是“......一种特殊的变量,其值在执行过程中通常不会被程序改变......”
如果是这种情况,为什么会这样:
const char *words[4] = { "aardvark", "abacus",
"allude", "zygote" };
*words = "first";
words[1] = "second";
int wordCount = 4;
int i;
for (i = 0; i < wordCount; i++) {
NSLog (@"%s is %d characters long",
words[i], strlen(words[i]));
}
有一个输出: “第一” “第二” “暗示” “zygote”(显然有长度等)。
我认为“const”的重点是防止被修改的变量??
答案 0 :(得分:19)
const
仅适用于char
,即字符串本身的内容,但不适用于数组。如果您希望数组的内容也是常量,则需要在每个级别添加const
:
char const* const words[4] = { "aardvark", "abacus", "allude", "zygote" };
// ^ ^
// | This makes words[x] = "abc"; fails.
// |
// This makes words[x][y] = 'a'; fails
答案 1 :(得分:3)
解读声明:
const char *words[4] = { "aardvark", "abacus", "allude", "zygote" };
这说,“我想要一个4个指向常数字符的数组。这些常数字符应该是......”
在记忆中,你最终得到了这个:
0x04, // The pointer to the array of words
0x14, 0x1d, 0x24, 0x3b, // The 4 pointers within words
'a','a','r','d','v','a','r','k','\0','a','b','a','c','u','s','\0',
'a','l','l','u','d','e','\0','z','y','g','o','t','e','\0'
不允许更改这些字符中的每一个。你不能这样做,因为你要改变这封信:
words[0][0] = 'b';
没有人对这些指针说过任何话。
words[0] = "new string";
这会导致您在内存中获取此内容:
0x04, // The pointer to the array of words
0x42, 0x1d, 0x24, 0x3b, // The 4 pointers within words, note the first one changed
'a','a','r','d','v','a','r','k','\0','a','b','a','c','u','s','\0',
'a','l','l','u','d','e','\0','z','y','g','o','t','e','\0',
'n','e','w',' ','s','t','r','i','n','g','\0'
请注意,在内存中,没有原始字符串发生更改。发生的唯一两个变化是:
1 - 单词中的第一个指针变为指向新地址。 2 - “新字符串”的字符被添加到该新地址的内存中。
现在破译这句话:
char const* const words[4] = { "aardvark", "abacus", "allude", "zygote" };
这就是说,“我想要一个包含常量字符的4个常量指针的数组。这些常量字符应该是......”这些指针永远不允许指向任何其他指针。永远不允许这些角色成为其他角色。
细心的读者可能会询问是否需要使指向数组的指针保持不变。答案是......我不太确定。我想说它暗示它是不变的,但我不太确定,我的笔记本电池即将耗尽。
希望它可以帮助其他任何发生这种情况的人!