为什么两个字符串数组内容一样,比较结果却不相等?

时间:2022-10-11 14:00:56
各位好,我是新手,我定义了两个字符串数组和两个指针,存储的内容相等,分别进行比较,比较结果指针相同,数组不相同,请问各位高手这是为什么?我查看他们的地址是各不相同的~~~
#include<iostream.h>
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"; 
 cout<<( str1 == str2 )<<endl; 
 cout << ( str3 == str4 ) << endl; 
 cout << ( str5 == str6 ) << endl; 
 cout << ( str7 == str8 ) << endl; 
 cout<<&str1<<"  "<<&str2<<endl;
 cout<<&str3<<"  "<<&str4<<endl;
 cout<<&str5<<"  "<<&str6<<endl;
 cout<<&str7<<"  "<<&str8<<endl;
结果是:
}
0
0
1
1
0x0012FF7C  0x0012FF78
0x0012FF74  0x0012FF70
0x0012FF6C  0x0012FF68
0x0012FF64  0x0012FF60
Press any key to continue

16 个解决方案

#1


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

你这个比较得是地址是否相等,并不是内容是否相等。你用string看看就不一样了。

#2


补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?

#3


char*不能直接比较大小的,这里的str1 str2实际上表示的不是字符串本身,而是字符串的首地址。要比较的话,C++就用string,C就用strcmp函数。

#4


   可是如果比较的是地址的话,后两组地址也是不一样的呀,为什么输出是1呢?难道指针指针比较的就又变成内容了?

#5


引用 4 楼 wffghd 的回复:
  可是如果比较的是地址的话,后两组地址也是不一样的呀,为什么输出是1呢?难道指针指针比较的就又变成内容了?


http://www.9php.com/FAQ/cxsjl/c/2009/07/0255836147973.html
刚好搜到一个网页是讨论你这个问题的。

#6


str5到str8定义成指针,那么"abc"就存储在静态区,实际上str5到str8都指向的是同一块内存~

#7


谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
     str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl; 
cout < <&str7 < <"  " < <&str8 < <endl; 
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?

#8


引用 2 楼 wffghd 的回复:
补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?


str1、2、3、4都是不同的数组对象,它们具有不同的地址这个不需要再说啥了。

但5、6、7、8都是指针,它们指向的字符串字面量具有相同的形式,都是"abc",c/c++标准规定,一个字符串字面量是否具有唯一的引用位置是实现定义的,一个编译器可以把所有的引用指向同一个实例,也可以各个引用指向各自独立的实例。

如果编译器采用同一个实例的方式,5、6、7、8就都具有相同的值,如果是不同的实例,那么5、6、7、8各自有不同的值。

从你贴出的结果来看,你使用的编译器采用的是同一个实例的方式。

标准原文如下:

2.13.4 String literals [lex.string]
................
 Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation defined.

#9


引用 7 楼 wffghd 的回复:
谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
    str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl;
cout < <&str7 < <"  " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?


你这里打印的是四个不同的指针对象的地址,当然全都不一样的啦。你想打印它们的值的话,要改成这样:


cout << ( void* )str5 << "  " << ( void* )str6 << endl; 
cout << ( void* )str7 << "  " << ( void* )str8 << endl; 

#10


引用 7 楼 wffghd 的回复:
谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
    str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl;
cout < <&str7 < <"  " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?


不同的。&str5表示的是str5这个指针的地址,而不是它所指向的地址。

#11


学习啦

#12


引用 2 楼 wffghd 的回复:
补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?
str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。另外,str7、str8和str5、str6类似,str7和str8应该写成str5和str6的形式。

#13


引用 7 楼 wffghd 的回复:
谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
    str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl;
cout < <&str7 < <"  " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?


str5到str8都是指针型的变量,所有的变量都要有存放它的地址的,你说打印的是存放个变量的地址,而不是他们的值。

#14


感谢各位的热心解答,我对这个问题有了新的认识,也明白了自己的误区在哪:
  a、str1==str2比较的是地址,而不是内容;
   b、每个数组对象都分配了自己的存储空间,地址各不相同;
   c、指针变量并不分配存储区,而是指向常量“abc”所在的静态存储区,由于是指向同一个常量,所以str5,str6,str7,str8指向的地址相同;
   d、str1,str 2,str 3,str 4是数组,&str1是数组的首地址;str8是指针,&str8是指针本身的地址,而非指针指向的地址;
  
 

#15


嘿嘿……你比较的是他们的指针!
用strcmp()函数便可以了!
有不懂得问题随时找我^
交个朋友

#16


char * 更加类似于string类,而且重载了很多运算符如你程序中的“==”,“<<”。
所以比较的是字符串的内容(重载的效果),而char[] 由于是没有重载——是默认效果,比较的是地址!


还有什么不懂得可随时问我,qq544066258

#1


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

你这个比较得是地址是否相等,并不是内容是否相等。你用string看看就不一样了。

#2


补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?

#3


char*不能直接比较大小的,这里的str1 str2实际上表示的不是字符串本身,而是字符串的首地址。要比较的话,C++就用string,C就用strcmp函数。

#4


   可是如果比较的是地址的话,后两组地址也是不一样的呀,为什么输出是1呢?难道指针指针比较的就又变成内容了?

#5


引用 4 楼 wffghd 的回复:
  可是如果比较的是地址的话,后两组地址也是不一样的呀,为什么输出是1呢?难道指针指针比较的就又变成内容了?


http://www.9php.com/FAQ/cxsjl/c/2009/07/0255836147973.html
刚好搜到一个网页是讨论你这个问题的。

#6


str5到str8定义成指针,那么"abc"就存储在静态区,实际上str5到str8都指向的是同一块内存~

#7


谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
     str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl; 
cout < <&str7 < <"  " < <&str8 < <endl; 
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?

#8


引用 2 楼 wffghd 的回复:
补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?


str1、2、3、4都是不同的数组对象,它们具有不同的地址这个不需要再说啥了。

但5、6、7、8都是指针,它们指向的字符串字面量具有相同的形式,都是"abc",c/c++标准规定,一个字符串字面量是否具有唯一的引用位置是实现定义的,一个编译器可以把所有的引用指向同一个实例,也可以各个引用指向各自独立的实例。

如果编译器采用同一个实例的方式,5、6、7、8就都具有相同的值,如果是不同的实例,那么5、6、7、8各自有不同的值。

从你贴出的结果来看,你使用的编译器采用的是同一个实例的方式。

标准原文如下:

2.13.4 String literals [lex.string]
................
 Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementation defined.

#9


引用 7 楼 wffghd 的回复:
谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
    str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl;
cout < <&str7 < <"  " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?


你这里打印的是四个不同的指针对象的地址,当然全都不一样的啦。你想打印它们的值的话,要改成这样:


cout << ( void* )str5 << "  " << ( void* )str6 << endl; 
cout << ( void* )str7 << "  " << ( void* )str8 << endl; 

#10


引用 7 楼 wffghd 的回复:
谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
    str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl;
cout < <&str7 < <"  " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?


不同的。&str5表示的是str5这个指针的地址,而不是它所指向的地址。

#11


学习啦

#12


引用 2 楼 wffghd 的回复:
补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?
str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。另外,str7、str8和str5、str6类似,str7和str8应该写成str5和str6的形式。

#13


引用 7 楼 wffghd 的回复:
谢谢各位,我理解了每个数组分配的内存空间不一样,我那样一比较内存首地址所以不一样;还有一个问题
    str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <"  " < <&str6 < <endl;
cout < <&str7 < <"  " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?


str5到str8都是指针型的变量,所有的变量都要有存放它的地址的,你说打印的是存放个变量的地址,而不是他们的值。

#14


感谢各位的热心解答,我对这个问题有了新的认识,也明白了自己的误区在哪:
  a、str1==str2比较的是地址,而不是内容;
   b、每个数组对象都分配了自己的存储空间,地址各不相同;
   c、指针变量并不分配存储区,而是指向常量“abc”所在的静态存储区,由于是指向同一个常量,所以str5,str6,str7,str8指向的地址相同;
   d、str1,str 2,str 3,str 4是数组,&str1是数组的首地址;str8是指针,&str8是指针本身的地址,而非指针指向的地址;
  
 

#15


嘿嘿……你比较的是他们的指针!
用strcmp()函数便可以了!
有不懂得问题随时找我^
交个朋友

#16


char * 更加类似于string类,而且重载了很多运算符如你程序中的“==”,“<<”。
所以比较的是字符串的内容(重载的效果),而char[] 由于是没有重载——是默认效果,比较的是地址!


还有什么不懂得可随时问我,qq544066258