澄清并记住C中的const用法

时间:2013-05-22 00:01:32

标签: c

argv是一个指向字符的常量指针数组

char * const argv[] // 1

argv是一个指向字符的指针数组,它是常量

const char * argv[] // 2

是否有提示记住1号?

3 个答案:

答案 0 :(得分:4)

const char * argv[] // 2

也可以写成:

char const * argv[] // 3

因为C不关心类型中const的顺序。如果你这样写,那么实际上const就是关键字const左边的东西。 const首先出现的形式是该规则的一个例外;但在这种情况下const的左边没有任何内容,所以用这个经验法则很容易避免这种情况。

char*             // mutable pointer to mutable char
char const*       // mutable pointer to constant char
char * const      // constant pointer to mutable char
char const* const // constant pointer to constant char

答案 1 :(得分:2)

char * const argv[]

有一些简单的规则,如 cskoala 在他的回答中提到的那样:

  1. 查找标识符

    char * const     argv     []
                      |
                  identifier
                      1  
    
  2. 读取标识符右侧的所有元素,从左到右

    char * const     argv       []
                      |         |
                  identifier  array
                      1         2
    
  3. 读取标识符左侧的所有元素,从右向左

    char     *     const    argv       []
      |      |       |        |         |
    char  pointer  const  identifier  array
      5      4       3        1         2
    
  4. 结果:(1)argv是(2)一个(3)常量类型数组(4)指向(5)char

    的数组

    其他例子。

        char  const     *       argv       []
          |     |       |         |         |
        char  const  pointer  identifier  array
          5     4       3         1         2
    

    结果:(1)argv是(2)指向(4)类型(5)char的常量的(3)指针的数组

        char  const     *     const    argv       []
          |     |       |       |        |         |
        char  const  pointer  const  identifier  array
          6     5       4       3        1         2
    

    结果:(1)argv是(2)一个(3)常量类型数组(4)指向(5)常量类型(6)char


    这个简单的规则有一个特别难看的例外。由于某种原因,C允许将const修饰符放在类型的左侧,如示例所示:

        const  char     *       argv       []
          |      |      |         |         |
        const  char  pointer  identifier  array
          4      5      3         1         2
    

    在我看来,最好避免这种声明,以保持一致性。这通常会导致混乱或错误。

答案 2 :(得分:1)

在我的大学里,我们学到了一种叫做“左右规则”的东西,它几乎是一种以告诉你它们的方式阅读变量的方法。

以下是该页面的链接:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html

它看起来很多,但经过一些例子后,它有助于理解这些类型的东西! =]