//  (C) Porkolab 2003
//
//  A.1.1.
//  Character arrays and string literals 

#include <iostream>

int main()
{
    // declaration of three arrays in the user data area
    // read and write permissions for the elements:
    char t1[] = {'H','e','l','l','o','\0'};
    char t2[] = "Hello";
    char t3[] = "Hello";

    // declaration of two pointers in the user data area
    // read and write permissions for the pointers
    // ...and...
    // allocation of the "Hello" literal (possibly) read-only 
    char  *s1 = "Hello";    // s1 points to 'H'
    char  *s2 = "Hello";    // ... and s2 likely points to the same place   

    void  *v1 = t1, *v2 = t2, *v3 = t3, *v4 = s1, *v5 = s2;
    std::cout <<v1<<'\t'<<v2<<'\t'<<v3<<'\t'<<v4<<'\t'<<v5<<std::endl;
    // the result (v1, v2 v3 are different, v4 and v5 could be the same):
    0xbffff460   0xbffff450    0xbffff440   0x8048844   0x8048844

    // assignment to array elements:
    *t1 = 'x'; *t2 = 'q'; *ct = 'y';

    // modifying string literal: could be segmentation error: 
    *s1 = 'w'; *s2 = 'z';

    return 0;
}


/////////////////////////////////////////////////////////////////


#include <iostream>

int main()
{
    char  t[] = "Hello";
    const char ct[] = "Hello";

    // the type of "Hello" is const char[6]
    // const char[] --> char* conversion is 
    // only for C reverse compatibility
    char  *s1 = "Hello";    // line 12: warning

    // this is the correct C++ way:
    const char  *s2 = "Hello";

    // this program produce warnings:
    2_const.cpp: In function `int main()':
    2_const.cpp:12: warning: invalid conversion from `const void*' to `void*'
    2_const.cpp:17: assignment of read-only location


    void  *v1 = t, *v2 = ct, *v3 = s1, *v4 = s2;    // line 17: warning
    std::cout << v1 << '\t' << v2 << '\t' << v3 << '\t' << v4 << std::endl;
    *t = 'x'; *ct = 'y'; *s1 = 'w'; *s2 = 'z';

    return 0;
}


/////////////////////////////////////////////////////////////////


#include <iostream>

int main()
{
    char  t[] = "Hello";
    const char  *s1 = "Hello";

    *t = 'x';
    *s1 = 'w';  // line 12: syntax error

    return 0;
}

// this program won't compile:
3_const.cpp: In function `int main()':
3_const.cpp:12: assignment of read-only location