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

kev*_*rpe 4 c arrays pointers const char

我试图理解数组声明,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*)
Run Code Online (Sandbox Code Playgroud)

或者,我们可以手动声明数组大小:

      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*)
Run Code Online (Sandbox Code Playgroud)

如何获得类型的结果变量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" ;
Run Code Online (Sandbox Code Playgroud)

谢谢

rui*_*rui 9

const char *const s15 = "abc";
Run Code Online (Sandbox Code Playgroud)

  • @PP:它不是从右到左,而是从左到右,它是**从里到外**. (6认同)
  • 从右到左阅读以理解什么是常数是有帮助的.例如`char*const s15`表示常量指针到char.`char const*s15`表示指向常量char的指针.`char const*const s15`表示常量指针到常量char.试试吧!右到左! (2认同)
  • @PP:从右到左的规则并不适用于所有情况.例如`int blah [5] [2]`.有关如何阅读我发现的声明符的最佳摘要如下:http://msdn.microsoft.com/en-us/library/1x82y1z4.aspx. (2认同)
  • C声明应按顺时针方向阅读:http://c-faq.com/decl/spiral.anderson.html (2认同)

caf*_*caf 6

你的第一个typeof评论并不正确.的类型的s01IS char [4],和类型的s02s03const char [4].当在表达式中使用而不是&sizeof运算符的主题时,它们将分别评估类型的rvalues,char *const char *指向数组的第一个元素.

你不能以这样的方式声明它们,使它们衰变为一个本身符合const的rvalue; 拥有一个const限定的rvalue并没有任何意义,因为rvalues不能被赋值.这就像是说你想要一个5类型const int而不是类型的常量int.


Oli*_*rth 5

s01et al不是真正的指针类型,它们是数组类型.从这个意义上讲,它们的行为有点像const指针(例如,你无法重新分配s01到其他地方).