C:声明一个指向常量字符数组的常量指针
我试图理解数组声明,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" ;
谢谢
const char *const s15 = "abc";
你的第一个类型的评论并不是真的正确。 s01
的类型是char [4]
, s02
和s03
的类型是const char [4]
。 当在表达式中使用而不是&
或sizeof
运算符的主题时,它们将分别计算为char *
和const char *
类型的rvalues,指向数组的第一个元素。
你不能以这样的方式声明它们,使它们衰变为一个本身符合const的rvalue; 具有const限定的右值没有任何意义,因为无法分配rvalues。 这就像是说你想要一个类型为const int
而不是int
的5
常量。
s01
等不是真正的指针类型,它们是数组类型。 从这个意义上讲,它们的行为有点像const
指针(例如,你不能将s01
重新分配到其他地方)。
使用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函数需要指向第一个元素的指针。