void main() { 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";
std::cout<<(str1==str2)<<(str3==str4)<<(str5==str6)<<(str7==str8)<<std::endl;
} 输出0 0 1 1,为什么
你要知道,你定义一个数组,是要分配存储空间的 你是先定义他,然后给他赋值的,首先char str1[]="abc"; 你定义了一个str1的数组,然后将字符穿赋给他 系统就已经分配了一个存储空间给他,也就是说,这些存储空间 已经被用了,不再是可用于分配的存储空间了 因此,在之后char str2[]="abc"; 就不可能分配相同的空间给str2,所以自然地址是不可能相同的 同理,这两个也是一样的 const char str3[]="abc"; const char str4[]="abc"; 因此,他们俩个的地址都是不同的,哦,忘说了str3和str4都是数组名 他们实际都是个指针,都存储的是地址,存储什么样的地址呢,存储的是系统为其分配的存储空间的首地址的 因此,str3肯定不会等于str4的,系统不会为他们分配相同的存储空间给他们俩的,因为给str3分配存储空间之后,这些存储空间就是不可用的了 自然给str4分配存储空间时,自然是分配的另外的存储空间了 而对于const char *str5 = "abc"; const char *str6 = "abc"; 这两个指针存储的都是字符串"abc"的地址,因此他们俩的值是相等的 即都是字符串的地址 现在应该知道了把,总之,把握住一点,系统是先分配存储空间,然后给存储空间赋值,已经分配了的存储空间是不能再被使用的,所以,既然不能再使用了,因此,自然地址是不会相同的