#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相同。