#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看看就不一样了。
cout < < ( str3 == str4 ) < < endl;
cout < < ( str5 == str6 ) < < endl;
cout < < ( str7 == str8 ) < < endl;
你这个比较得是地址是否相等,并不是内容是否相等。你用string看看就不一样了。
#2
补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?
str1 == str2 比较的不仅是内容?
#3
char*不能直接比较大小的,这里的str1 str2实际上表示的不是字符串本身,而是字符串的首地址。要比较的话,C++就用string,C就用strcmp函数。
#4
可是如果比较的是地址的话,后两组地址也是不一样的呀,为什么输出是1呢?难道指针指针比较的就又变成内容了?
#5
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;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?
str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <" " < <&str6 < <endl;
cout < <&str7 < <" " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?
#8
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
你这里打印的是四个不同的指针对象的地址,当然全都不一样的啦。你想打印它们的值的话,要改成这样:
cout << ( void* )str5 << " " << ( void* )str6 << endl;
cout << ( void* )str7 << " " << ( void* )str8 << endl;
#10
不同的。&str5表示的是str5这个指针的地址,而不是它所指向的地址。
#11
学习啦
#12
str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。另外,str7、str8和str5、str6类似,str7和str8应该写成str5和str6的形式。
#13
str5到str8都是指针型的变量,所有的变量都要有存放它的地址的,你说打印的是存放个变量的地址,而不是他们的值。
#14
感谢各位的热心解答,我对这个问题有了新的认识,也明白了自己的误区在哪:
a、str1==str2比较的是地址,而不是内容;
b、每个数组对象都分配了自己的存储空间,地址各不相同;
c、指针变量并不分配存储区,而是指向常量“abc”所在的静态存储区,由于是指向同一个常量,所以str5,str6,str7,str8指向的地址相同;
d、str1,str 2,str 3,str 4是数组,&str1是数组的首地址;str8是指针,&str8是指针本身的地址,而非指针指向的地址;
a、str1==str2比较的是地址,而不是内容;
b、每个数组对象都分配了自己的存储空间,地址各不相同;
c、指针变量并不分配存储区,而是指向常量“abc”所在的静态存储区,由于是指向同一个常量,所以str5,str6,str7,str8指向的地址相同;
d、str1,str 2,str 3,str 4是数组,&str1是数组的首地址;str8是指针,&str8是指针本身的地址,而非指针指向的地址;
#15
嘿嘿……你比较的是他们的指针!
用strcmp()函数便可以了!
有不懂得问题随时找我^
交个朋友
用strcmp()函数便可以了!
有不懂得问题随时找我^
交个朋友
#16
char * 更加类似于string类,而且重载了很多运算符如你程序中的“==”,“<<”。
所以比较的是字符串的内容(重载的效果),而char[] 由于是没有重载——是默认效果,比较的是地址!
还有什么不懂得可随时问我,qq544066258
所以比较的是字符串的内容(重载的效果),而char[] 由于是没有重载——是默认效果,比较的是地址!
还有什么不懂得可随时问我,qq544066258
#1
cout < <( str1 == str2 ) < <endl;
cout < < ( str3 == str4 ) < < endl;
cout < < ( str5 == str6 ) < < endl;
cout < < ( str7 == str8 ) < < endl;
你这个比较得是地址是否相等,并不是内容是否相等。你用string看看就不一样了。
cout < < ( str3 == str4 ) < < endl;
cout < < ( str5 == str6 ) < < endl;
cout < < ( str7 == str8 ) < < endl;
你这个比较得是地址是否相等,并不是内容是否相等。你用string看看就不一样了。
#2
补充一下,我查看他们的内容,输出都显示为“abc”,那为什么前两个不相等,后两个相等呢?难道
str1 == str2 比较的不仅是内容?
str1 == str2 比较的不仅是内容?
#3
char*不能直接比较大小的,这里的str1 str2实际上表示的不是字符串本身,而是字符串的首地址。要比较的话,C++就用string,C就用strcmp函数。
#4
可是如果比较的是地址的话,后两组地址也是不一样的呀,为什么输出是1呢?难道指针指针比较的就又变成内容了?
#5
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;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?
str5到str8都指向的是同一块内存的话,为什么
cout < <&str5 < <" " < <&str6 < <endl;
cout < <&str7 < <" " < <&str8 < <endl;
的内容是不一样的呢?要是指向同一内存,是不是应该是一样的?
#8
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
你这里打印的是四个不同的指针对象的地址,当然全都不一样的啦。你想打印它们的值的话,要改成这样:
cout << ( void* )str5 << " " << ( void* )str6 << endl;
cout << ( void* )str7 << " " << ( void* )str8 << endl;
#10
不同的。&str5表示的是str5这个指针的地址,而不是它所指向的地址。
#11
学习啦
#12
str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。另外,str7、str8和str5、str6类似,str7和str8应该写成str5和str6的形式。
#13
str5到str8都是指针型的变量,所有的变量都要有存放它的地址的,你说打印的是存放个变量的地址,而不是他们的值。
#14
感谢各位的热心解答,我对这个问题有了新的认识,也明白了自己的误区在哪:
a、str1==str2比较的是地址,而不是内容;
b、每个数组对象都分配了自己的存储空间,地址各不相同;
c、指针变量并不分配存储区,而是指向常量“abc”所在的静态存储区,由于是指向同一个常量,所以str5,str6,str7,str8指向的地址相同;
d、str1,str 2,str 3,str 4是数组,&str1是数组的首地址;str8是指针,&str8是指针本身的地址,而非指针指向的地址;
a、str1==str2比较的是地址,而不是内容;
b、每个数组对象都分配了自己的存储空间,地址各不相同;
c、指针变量并不分配存储区,而是指向常量“abc”所在的静态存储区,由于是指向同一个常量,所以str5,str6,str7,str8指向的地址相同;
d、str1,str 2,str 3,str 4是数组,&str1是数组的首地址;str8是指针,&str8是指针本身的地址,而非指针指向的地址;
#15
嘿嘿……你比较的是他们的指针!
用strcmp()函数便可以了!
有不懂得问题随时找我^
交个朋友
用strcmp()函数便可以了!
有不懂得问题随时找我^
交个朋友
#16
char * 更加类似于string类,而且重载了很多运算符如你程序中的“==”,“<<”。
所以比较的是字符串的内容(重载的效果),而char[] 由于是没有重载——是默认效果,比较的是地址!
还有什么不懂得可随时问我,qq544066258
所以比较的是字符串的内容(重载的效果),而char[] 由于是没有重载——是默认效果,比较的是地址!
还有什么不懂得可随时问我,qq544066258