Objective-C“const”问题

时间:2010-10-17 16:01:41

标签: objective-c const

维基百科说“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”的重点是防止被修改的变量??

2 个答案:

答案 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个常量指针的数组。这些常量字符应该是......”这些指针永远不允许指向任何其他指针。永远不允许这些角色成为其他角色。

细心的读者可能会询问是否需要使指向数组的指针保持不变。答案是......我不太确定。我想说它暗示它是不变的,但我不太确定,我的笔记本电池即将耗尽。

希望它可以帮助其他任何发生这种情况的人!