#include <iostream> #include <stdio.h> //#include <string.h> using namespace std; int main() { char str1[]= "abc";//堆分配,str1为地址 char str2[]= "abc";//堆分配,str2为地址 const char str3[] = "abc";//堆分配,内容不可改变,str3为地址 const char str4[] = "abc";//堆分配,内容不可改变,str4为地址 const char* str5 = "abc";//常量内存区,str5指向常量 const char* str6 = "abc";//常量内存区,str6指向常量 const char* str7 = "laymu";//常量内存区,str7指向常量 const char* str8 = "laymu";//常量内存区,str8指向常量 str3[2]='d'; cout << ( str1==str2 )<< endl; // ==可以理解为函数,str1和str2均为地址,肯定不相同 cout << ( str3==str4 ) << endl; // ==可以理解为函数,str1和str2均为地址,肯定不相同 // 因为abc可能只被维持一份,故str5和str6在这种情况下相同(地址相同),均指向相同的一块常量地址 cout << ( str5==str6 ) << endl; // 因为abc可能只被维持一份,故str5和str6在这种情况下相同(地址相同),均指向相同的一块常量地址 cout << ( str7==str8 ) << endl; cout << boolalpha << ( str1==str2 )<< endl; // 输出什么? cout << boolalpha << ( str3==str4 ) << endl; // 输出什么? cout << boolalpha << ( str5==str6 ) << endl; // 输出什么? cout << boolalpha << ( str7==str8 ) << endl; // 输出什么? system("pause"); return 0; }
先上代码,图中有三组比较,让你写出
char str1[]= "abc";//堆分配,str1为地址
char str2[]= "abc";//堆分配,str2为地址
const char str3[] = "abc";//堆分配,内容不可改变,str3为地址
const char str4[] = "abc";//堆分配,内容不可改变,str4为地址
const char* str5 = "abc";//常量内存区,str5指向常量
const char* str6 = "abc";//常量内存区,str6指向常量
const char* str7 = "laymu";//常量内存区,str7指向常量
const char* str8 = "laymu";//常量内存区,str8指向常量
cout << boolalpha << ( str1==str2 )<< endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
cout << boolalpha << ( str7==str8 ) << endl; // 输出什么?
首先要看看==,在c++中==等操作符已经被当做一般函数去实现,因此可以把==当函数来对待。
众所周知,数组名在函数参数列表中被当做地址来对待。
只要分析了这些字符串的内存实质,即可做出判断。
分析见代码注释。
需要说明一点的是:编译器对常量内存区相同字符串的处理,一般主流编译器对同一份常量只维持一份,因此会看到str5和str6相同。