argv是一个指向字符的常量指针数组
char * const argv[] // 1
argv是一个指向字符的指针数组,它是常量
const char * argv[] // 2
是否有提示记住1号?
答案 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 在他的回答中提到的那样:
查找标识符
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)指向(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
它看起来很多,但经过一些例子后,它有助于理解这些类型的东西! =]