转载自:http://blog.163.com/hangqiang321@yeah/blog/static/164202800201181685812566/
char str1[]="abc";
char str2[]="abc";
char str3[]="abc";
char str4[]="abc";
const char* str5="abc";
const char* str6="abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
答案:FALSE,FALSE,TRUE。
原因:
(1)系统为字符数组另外分配一块内存,并将“abc”存入这块内存,不管是不是const数组都是这样;
(2)而为const char* 仅分配一块存放其指针的内存,并不分配一块长度为4的内存空间来存放“abc”。=号后的“abc”以常量形式存于静态数据区,而指针自己仅是指向该区首地址的指针。因此所有字符指针的内容(字符串“abc”在静态数据区的首地址)都相同,故str5==str6为真。不管是const char* 还是char* ,都一样。
注意:
(1)字符指针本身的存放地址是不同的,即&str5==&str6 为假。
(2)想查看字符数组首地址具体是什么,即str1表示的地址是多少,可以cout << ( int*)str1<< endl,或者cout << &str1<< endl;不能直接cout << str1<< endl; 这样输出的是字符串“abc”。
而想要通过字符指针查看字符串首地址,即str5指向的地址是多少,只能cout << ( int*)str5<< endl;不能cout << &str5<< endl,这样输出的是str5这个指针存放的地址;也不能直接cout << str5<< endl; 这样输出的是字符串“abc”。