【问题标题】:Creating a const array of const elements创建 const 元素的 const 数组
【发布时间】:2015-02-04 11:43:22
【问题描述】:

我想声明一个常量 char 数组的常量数组。如果我这样写:

const char foo[] = "Foo";
const char bar[] = "Bar";
const char* const foobar[2] = { foo, bar };

它似乎有效,但如果我尝试使用 "the spiral rule" 读取它,foobar 会被读取为:

“foobar 是一个数组 2 的常量 (??) 指向一个 char 常量的指针”

使用这个stack overflow 答案,

const 适用于它剩下的东西。如果左边什么都没有,那么它适用于它右边的东西。

第一个const 将应用于字符,第二个const 也将应用于相同的字符。

这两种阅读方式都没有意义,但代码确实起作用(至少在 Arduino [对不起] 中)。哪个const 使哪个成为常数?有没有更合乎逻辑的写法?

【问题讨论】:

    标签: c pointers constants


    【解决方案1】:

    正如你所说:

    const 适用于它剩下的东西。如果左边什么都没有,那么它适用于它右边的东西。

    const char* const foobar[2] = { foo, bar };
    

    可以改写为:

    char const * const foobar[2] = { foo, bar };
    

    现在想象一下封装const 限定符和限定实体的括号:

    ((char const) (* const)) foobar[2] = // doesn't matter
    

    您已经写过 第二个 const 也适用于相同的字符。这不是真的 - 第二个const 指的是*,这意味着它是一个常量指针。

    总而言之,foobar 是一个指向常量字符的常量指针数组

    您可能还想阅读此主题:constant pointer vs pointer on a constant value

    【讨论】:

      【解决方案2】:

      挑剔但重要的一点;在 C 中,不可能有 const 数组。 (参考:C11 6.3.2.3/2)。

      所有看起来可能是 1 的东西实际上都是一个非常量数组,其元素是 constLink to related discussion

      在您的示例const char* const foobar[2] = { foo, bar }; 中,两个const 关键字的意思是:

      • 数组中的两个指针不能指向别处
      • 这些指针所指向的字符不应通过这些指针进行修改。

      文字描述为“foobar 是一个指向 char 常量的常量指针数组 2”。

      再次注意一个小而重要的区别,被指向的字符实际上可能是非常量char,因为const char * 可以同时指向常量和非常量。第一个const的作用是说我们可能不知道chars是否是const,所以我们不能安全地写入它们,所以如果我们尝试使用这个指针ot编译器会产生错误写信给他们。

      【讨论】:

        【解决方案3】:

        foobarconst 指向const char 的指针数组。数组总是不变的,没有办法显式使它成为const

        在函数参数的声明中,数组衰减为指针,const指针确实存在;在这种情况下,const 可以放在[] 中。这些是等价的:

        void func(int foo[const]) { ... }
        void func(int *const foo) { ... }
        

        螺旋规则并不完美(对于一些复杂的声明它会失败),我个人认为它与限定符(constvolatile 等)结合使用并没有帮助。除了语法本身(C11 6.7 和 6.7.6)之外,我不知道有什么可以准确地呈现规则。

        然而,在这种情况下,它似乎有效:

                            +--------------+
                            |      +---+   |
                            |      ^   |   |
               const char *const foobar[2] |
                     ^      ^          |   |
                     |      +----------+   |
                     +---------------------+
        

        foobarconst 指向const char 的数组(有2 个元素)。”

        【讨论】:

          猜你喜欢
          • 2013-06-29
          • 1970-01-01
          • 2015-01-28
          • 2020-04-02
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 2017-11-06
          • 2014-08-08
          相关资源
          最近更新 更多