代码之家  ›  专栏  ›  技术社区  ›  kevinarpe Dario Hamidi

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

  •  4
  • kevinarpe Dario Hamidi  · 技术社区  · 14 年前

    我试图理解数组声明、常量及其结果变量类型。

          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 回复  |  直到 14 年前
        1
  •  9
  •   rui    14 年前
    const char *const s15 = "abc";
    
        2
  •  6
  •   caf    14 年前

    你的第一个 typeof 评论不是很正确。类型 s01 char [4] ,以及 s02 s03 const char [4] . 当用在表达式中而不是 & sizeof 运算符,它们将计算为类型为 char * const char * 分别指向数组的第一个元素。

    5 类型的常量 const int 而不是 int

        3
  •  5
  •   Oliver Charlesworth    14 年前

    s01 等人不是真正的指针类型,他们是数组类型。从这个意义上说,他们的行为已经有点像了 const 指针(不能重新分配 第一季 指其他地方,例如)。

        4
  •  3
  •   Gilles 'SO- stop being evil'    14 年前

    使用 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函数需要指向第一个元素的指针。