C:声明一个指向常量字符数组的常量指针

时间:2010-08-19 11:22:20

标签: c arrays pointers char const

我试图理解数组声明,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" ;

由于

4 个答案:

答案 0 :(得分:9)

const char *const s15 = "abc";

答案 1 :(得分:6)

您的第一个typeof评论并不正确。 s01的类型为char [4]s02s03的类型为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函数需要一个指向第一个元素的指针。