我试图理解数组声明,constness及其产生的变量类型。
允许以下内容(由我的编译器):
char s01[] = "abc" ; // typeof(s01) = char*
const char s02[] = "abc" ; // typeof(s02) = const char* (== char const*)
char const s03[] = "abc" ; // typeof(s03) = char const* (== const char*)
或者,我们可以手动声明数组大小:
char s04[4] = "abc" ; // typeof(s04) = char*
const char s05[4] = "abc" ; // typeof(s05) = const char* (== char const*)
char const s06[4] = "abc" ; // typeof(s06) = char const* (== const char*)
如何获得const char* const
类型的结果变量?以下是不允许的(由我的编译器):
const char s07 const[] = "abc" ;
char const s08 const[] = "abc" ;
const char s09[] const = "abc" ;
char const s10[] const = "abc" ;
const char s11 const[4] = "abc" ;
char const s12 const[4] = "abc" ;
const char s13[4] const = "abc" ;
char const s14[4] const = "abc" ;
由于
答案 0 :(得分:9)
const char *const s15 = "abc";
答案 1 :(得分:6)
您的第一个typeof
评论并不正确。 s01
的类型为char [4]
,s02
和s03
的类型为const char [4]
。当在表达式中使用而不是&
或sizeof
运算符的主题时,它们将分别评估类型为char *
和const char *
的rvalues,指向第一个元素数组。
你不能以这样的方式声明它们,使它们衰变为一个本身符合const的rvalue;拥有一个const限定的rvalue并没有任何意义,因为rvalues不能被赋值。这就像是说你想要一个类型为5
的{{1}}常量,而不是const int
。
答案 2 :(得分:5)
s01
等不是真正的指针类型,它们是数组类型。从这个意义上说,它们的行为有点像const
指针(例如,你不能重新指定s01
指向其他地方。)
答案 3 :(得分:3)
使用cdecl:
cdecl> declare foo as constant pointer to array of constant char
Warning: Unsupported in C -- 'Pointer to array of unspecified dimension'
(maybe you mean "pointer to object")
const char (* const foo)[]
cdecl> declare foo as constant pointer to array 4 of constant char
const char (* const foo)[3]
cdecl> declare foo as constant pointer to constant char
const char * const foo
指向数组的指针很少用于C;通常API函数需要一个指向第一个元素的指针。