char str1[] = _T("abc")
char str2[] = _T("abc")

结果:str1 != str2
分析:str1和str2是字符数组类型,它们在栈区中获得空间并被用常量"abc"初始化,所以这两个数组的首地址str1和str2的值是不一样的

const char str3[] = _T("abc")
const char str4[] = _T("abc")

结果:str3 != str4
分析:原因同上,区别在于str3和str4是常量字符数组,不能作为左值被赋值

const char* str5 = _T("abc")
const char* str6 = _T("abc")

结果:str5 == str6
分析:常量指针变量str5和str6在被定义的时候就被赋以初值指向常量字符串"abc",但这个常量字符串"abc"在程序中到底是只有一份还是有两份视编译器的优化情况而定,若编译器做了优化,那么一般只有一份常量字符串"abc",而且这个常量字符串"abc"一般会被放在全局数据区,在这种情况下常量指针变量str5和str6的值就相等了.

char* str7 = _T("abc")
char* str8 = _T("abc")

结果:str7 == str8
分析:原因同上,区别在于程序虽然能编译含有 *str7 = _T('1') (将指针变量作为左值进行赋值)的语句,但是运行会出错,因为指针指向的是一个常量字符串,而常量字符串不允许重新被赋值.

程序分为全局数据区,代码区,堆区和栈区四个基本部分.