A char* has special meaning in many functions that deal with string processing (which streams do). So if you do the first cout << s << '\n', it will try to treat the char * as a string, and will give you undefined results. It will start printing at chA and go until it finds a NULL character, which may be the next element or may be well down the road. In doing this, it could try to access memory that your application doesn't own or memory that is already used by a different variable in the system. To get the pointer address, you actually will need to cast it to the appropriate size for your system. For instance, in a 32-bit architecture, you might try cout << reinterpret_cast<long>(s) << '\n';.
For the "thank you", when you put a string literal in the code, the compiler will reserve space for it in the data table. The pointer will be assigned to the address in the data table. This will be read-only, though. If you try to change it (e.g. s[2] = 'W'), you will probably get an access violation error.