3

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

char * const argv[] // 1

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

const char * argv[] // 2

有记住数字 1 的提示吗?

4

3 回答 3

4
const char * argv[] // 2

也可以写成:

char const * argv[] // 3

因为 C 不关心类型中 const 的顺序。如果你这样写,那么这个东西实际上const就是关键字左边的那个东西const。where constis first 的形式是该规则的一个例外;但在那种情况下,左边什么都没有,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
于 2013-05-22T00:05:38.490 回答
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
    

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


其他例子。

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

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

    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

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

于 2013-05-22T00:49:22.537 回答
1

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

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

它看起来很多,但在几个例子之后,它有助于理解很多这类事情!=]

于 2013-05-22T00:07:26.267 回答