Search code examples
c++cimplicit-conversionc-stringsstring-literals

Where does const char* get the pointer to a memory address?


This may be simple question, but why does a const char* not need a memory address to point to?

Example:

const char* a = "Anthony";

and not:

const char *a = // Address to const char

like any other types do?


Solution

  • You can imagine this declaration

    const char* a = "Anthony";
    

    the following way

    const char string_literal[] = "Anthony";
    
    const char *a = string_literal;
    

    That is the compiler creates an array of characters with the static storage duration that stores the string "Anthony" and the address of the first character of the array (due to the implicit conversion of array designators to pointers to their first characters) is assigned to the pointer a.

    Here is a demonstrative program that shows that string literals are character arrays.

    #include <iostream>
    #include <type_traits>
    
    decltype( auto ) f()
    {
        return ( "Anthony" );
    }
    
    template <size_t N>
    void g( const char ( &s )[N] )
    {
        std::cout << s << '\n';
    }
    
    int main() 
    {
        decltype( auto ) r = f();
    
        std::cout << "The size of the referenced array is "
                  << std::extent<std::remove_reference<decltype( r )>::type>::value
                  << '\n';
    
        g( r );
    
        return 0;
    }
    

    The program output is

    The size of the referenced array is 8
    Anthony
    

    The size of the string literal (of the array that stores the string literal) is equal to 8 because the string includes also the terminating zero character '\0'.

    In the demonstrative program the expression

    std::extent<std::remove_reference<decltype( r )>::type>::value
    

    may be substituted for just the expression

    sizeof( r )