如何理解

怎么理解?
C/C++ code

char str1[]="abc";
char str2[]="abc";

const char str3[]="abc";
const char str4[]="abc";

char *str7="abc";
char *str8="abc";

cout<<(str1==str2)<<endl;
cout<<(str3==str4)<<endl;
cout<<(str5==str6)<<endl;
cout<<(str7==str8)<<endl;
  





0 0 1 1

------解决方案--------------------
作为c++标准控,我用c++标准来回答你,

首先,

str1和str2是不同的,开辟了新地址,用来存储"abc"。
同理,str3和str4是不同的,开辟了新地址用来存储"abc"。

其次,我主要是说明 str7和str8,因为str7和str8都指向一个字符串"abc",表面上看str7和str8应该相等,但是实际上却不一定总是相等。

先说结论,在绝大多数编译器下,str7==str8,但是并不是所有编译器都相等。

更浅白一点说,
char *stra = "abc";
char *strb = "abcd";
你可以看出stra和strb肯定不相等,因为他们指向了两个不同的字符串。

但是
char *stra = "abc";
char *strb = "abc";
stra和strb是否相等,其实取决于两个"abc"是否为同一个字符串。

而c++标准规定:这两个abc是否为同一个字符串,是编译器自定义行为,即有的编译器可能相同,有的编译器可能不相同。 (Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation defined.)

虽然绝大多数编译器都可以优化成同一个字符串,并不表示一定是这样。你的源代码最好也不要基于这种假设。

特别是当char *stra="abc"和char *strb = "abc"在两个不同文件的时候,有一些编译器在做链接的时候可能不会把这2个"abc"当成同一个字符串。

------解决方案--------------------
http://topic.csdn.net/u/20120205/02/ec825691-9211-4e06-bb45-6f59979af8f2.html
------解决方案--------------------
探讨

作为c++标准控,我用c++标准来回答你,

首先,

str1和str2是不同的,开辟了新地址,用来存储"abc"。
同理,str3和str4是不同的,开辟了新地址用来存储"abc"。

其次,我主要是说明 str7和str8,因为str7和str8都指向一个字符串"abc",表面上看str7和str8应该相等,但是实际上却不一定总是相等。

先说结论,在绝大多数编译器下,s……

------解决方案--------------------
char str1[]="abc";
char str2[]="abc";
str1和str2都是在堆栈上分配的,长度都是4,但是变量名代表地址,它们在堆栈上地址肯定不一样

const char str3[]="abc";
const char str4[]="abc";
同str1和str2

char *str7="abc";
char *str8="abc";
这里的str7和str8指向的是常量字符串abc的地址,编译器应该会给出警告的,如果修改str7和str8,则会报错,在C++中,常量字符串是保存在常量区,所有abc字符串的就是一个空间


cout<<(str1==str2)<<endl;
cout<<(str3==str4)<<endl;
cout<<(str5==str6)<<endl;
cout<<(str7==str8)<<endl;
str5和str6我就没有看到在哪了
------解决方案--------------------
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

------解决方案--------------------
可能不同编译器结果会不同;
堆栈,全局变量,静态字符串的区别;
------解决方案--------------------
探讨

char str1[]="abc";
char str2[]="abc";