C: declare a constant pointer to an array of constant characters

16,572

Solution 1

const char *const s15 = "abc";

Solution 2

Your first typeof comments aren't really correct. The type of s01 is char [4], and the types of s02 and s03 are const char [4]. When used in an expression and not the subject of either the & or sizeof operators, they will evaluate to rvalues of type char * and const char * respectively, pointing at the first element of the array.

You can't declare them in such a way that they decay to an rvalue that itself is const-qualified; it doesn't really make any sense to have a const-qualified rvalue, since rvalues can't be assigned to. It's like saying you want a 5 constant that is of type const int rather than int.

Solution 3

s01 et al are not really pointer types, they're array types. In that sense, they already act a bit like const pointers (you cannot re-assign s01 to point somewhere else, for instance).

Solution 4

Use 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

Pointers to arrays are rarely used in C; usually API functions expect a pointer to the first element.

Share:
16,572
kevinarpe
Author by

kevinarpe

LinkedIn Profile: https://hk.linkedin.com/pub/kevin-arpe/12/4a4/277 My open source libraries: Papaya for Java: https://github.com/kevinarpe/kevinarpe-papaya Rambutan for Python3: https://github.com/kevinarpe/kevinarpe-rambutan3 I specialise in answering older -- perhaps forgotten -- questions, and making corrections. Best answer: How to handle multipart/alternative mail with JavaMail?

Updated on June 14, 2022

Comments

  • kevinarpe
    kevinarpe almost 2 years

    I am trying to understand array declarations, constness, and their resulting variable types.

    The following is allowed (by my compiler):

          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*)
    

    Alternatively, we can declare the array size manually:

          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*)
    

    How do I get a resulting variable of type const char* const? The following are not allowed (by my compiler):

    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" ;
    

    Thanks