argv 是一个指向字符的常量指针数组
char * const argv[] // 1
argv 是一个指向字符的指针数组,它是常量
const char * argv[] // 2
有记住数字 1 的提示吗?
argv 是一个指向字符的常量指针数组
char * const argv[] // 1
argv 是一个指向字符的指针数组,它是常量
const char * argv[] // 2
有记住数字 1 的提示吗?
const char * argv[] // 2
也可以写成:
char const * argv[] // 3
因为 C 不关心类型中 const 的顺序。如果你这样写,那么这个东西实际上const
就是关键字左边的那个东西const
。where const
is 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
char * const argv[]
正如cskoala在他的回答中提到的,有一些简单的规则:
查找标识符
char * const argv []
|
identifier
1
读取标识符右侧的所有元素,从左到右
char * const argv []
| |
identifier array
1 2
读取标识符左侧的所有元素,从右到左
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
在我看来,最好避免这样的声明,以保持一致性。这通常会导致混乱或错误。
在我的大学里,我们学到了一种叫做“左右规则”的东西,它几乎是一种读取变量的方法,可以告诉你它们是什么。
这是该页面的链接:http: //ieng9.ucsd.edu/~cs30x/rt_lt.rule.html
它看起来很多,但在几个例子之后,它有助于理解很多这类事情!=]