大家先来看这道测试题:
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << (str1 == str2) << endl;
cout << (str3 == str4) << endl;
cout << (str5 == str6) << endl;
cout << (str7 == str8) << endl;
如果大家对于这样的输出结果已经心知肚明,那么对于后面的说明,可以当作是帮小弟来查错了。
现在来分析一下所以数据的内存分布:
char str1[] = "abc":
这里的"abc"是一个常量,首先会在常量存储区里存储"abc"这个常量,然后会因为"abc"被赋值给str1[],所以在栈中开辟一段内存,内存大小为4个节点(char数组后会自动加一个'\0'),然后又有一个"abc"被保存在栈中。
同理,str2[]中的"abc"也是保存在栈中,地址不同。
到此,有三个"abc"被保存起来,一个在常量存储区,另外两个在栈中。
此外,插一句,c++内存被分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
const char str3[] = "abc":
对于这种被const修饰起来的变量,一般也是被保存在常量存储区,但是,但是对于const数组来讲,系统不确定符号表是否有足够的空间来存放const数组,所以还是为const数组分配内存的。所以str3指向的是栈上的"abc"。
同理,str4[]也是保存在栈中,地址不同。
const char *str5 = "abc":
因为"abc"在常量存储区中保存有一份(即使没保存,这样的操作也会新建一份),这里str5定义的时候,嘿,我见过这个,str5就可以开心的直接指向"abc"所在的常量区的地址。
同理str6,str7,str8。与const没有半毛钱关系,const只是使得str5和str6无法指向新的字符串常量(也就是新的地址)。
这道题的输出结果是:
最后,还是一个小测试:
char ch1 = 'a';
char ch2 = 'a';
const char ch3 = 'a';
const char ch4 = 'a';
cout << (ch1 == ch2) << endl;
cout << (ch3 == ch4) << endl;
大家可以思考一下结果是什么...