c++的char[]和char*的区别

大家先来看这道测试题:

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;
还有,大家可以思考一下修改str7和str8是又会是发生了什么...

猜你喜欢

转载自blog.csdn.net/u013654125/article/details/79758286