请教一个关于字符数组指针的基本问题

anison 2008-10-22 12:00:46
有本书上说:
char *str1="abc";
char *str2="abc";
if(str1==str2)
cout<<"Equal"<<endl;
结果是判断条件不成立,理由是两次在常量区分类的是两个不同的内存空间,所以地址不同
但是这段代码在VS2005里运行有结果:Equal

个人认为str1,str2表示他们指向的字符串,那么str1==str2应该是判断他们指向的字符串是否相等,
所以这里会输出Equal,但是&str1==&str2就不成立。

这里我好不习惯,因为str1,str2是指针,按常理,指针本身的值就是地址,
那么str1==str2就是表示他们指向的地址是否一样……
是因为指向字符串的指针有特殊性吗?

初学者,很抱歉麻烦大家,谢谢
...全文
66 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiffa 2008-10-22
  • 打赏
  • 举报
回复
呃,上面我所说的第一点不太严谨,一个指针变量由两点来定义,1,指针类型;2,指针的值;我上面只是单纯地比较其值,忽略其类型。
太乙 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kiffa 的回复:]
1,和你的直觉相符,在没有重载 == 的前提下,“str1==str2就是表示他们指向的地址是否一样”这句话是对的,str1和str2是指针,判断它们是否相等,也就是判断他们所指向的地址是否一样,而不管它们指向的是什么。字符指针没有特权。而 &str1 和 str1 意义截然不同。

2,str1是否等于str2,需要看编译器,编译器可以选择把前后两个"abc"放在不同的位置,也就是说内存中有两个拷贝,这样str1 和 str2分别指向不同的地址;也可以…
[/Quote]

第1条我赞同,考虑很周到!
第二条嘛,我不大赞同,我到现在还没碰到这同一常量字符串放两份的!
kiffa 2008-10-22
  • 打赏
  • 举报
回复
1,和你的直觉相符,在没有重载 == 的前提下,“str1==str2就是表示他们指向的地址是否一样”这句话是对的,str1和str2是指针,判断它们是否相等,也就是判断他们所指向的地址是否一样,而不管它们指向的是什么。字符指针没有特权。而 &str1 和 str1 意义截然不同。

2,str1是否等于str2,需要看编译器,编译器可以选择把前后两个"abc"放在不同的位置,也就是说内存中有两个拷贝,这样str1 和 str2分别指向不同的地址;也可以只在内存中保留一份"abc",让str1和str2都指向它,标准对此没有指定,由编译器自己决定。
太乙 2008-10-22
  • 打赏
  • 举报
回复
如果这样:

char str1[]="abc";
char str2[]="abc";
这就不同了~!

str1/str2在栈上,地址不一样!
太乙 2008-10-22
  • 打赏
  • 举报
回复
汗~~str1,str2都是常量指针,指向的区域都是全局的静态存储区!这俩指向的地址一样!!
太乙 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 once_and_again 的回复:]
strcmp()
[/Quote]

这是要干嘛??
once_and_again 2008-10-22
  • 打赏
  • 举报
回复
strcmp()
vcminusminus 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 anison 的帖子:]
有本书上说:
char *str1="abc";
char *str2="abc";
if(str1==str2)
cout < <"Equal" < <endl;
结果是判断条件不成立,理由是两次在常量区分类的是两个不同的内存空间,所以地址不同
但是这段代码在VS2005里运行有结果:Equal
...
[/Quote]

楼主举的例子好像在钱能的《C++程序设计教程(第二版)》中见到过类似的例子,书中的确说的是条件不成立,而在VC6.0和VC2005中却成立,这可能与书中的例子没有使用微软的编译器有关,那本书使用的是Borland C++ Builder6.0编译器.这可能是编译器之间的差异造成的.
但总的来说,字符串是否相等的比较不要比较指针,而是要使用strcmp函数.
帅得不敢出门 2008-10-22
  • 打赏
  • 举报
回复
char *str1="abc";
char *str2="abc";
"abc";是const char*放在常量区 两个指针都指向它地址自然一样.
pengzhixi 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kiffa 的回复:]
1,和你的直觉相符,在没有重载 == 的前提下,“str1==str2就是表示他们指向的地址是否一样”这句话是对的,str1和str2是指针,判断它们是否相等,也就是判断他们所指向的地址是否一样,而不管它们指向的是什么。字符指针没有特权。而 &str1 和 str1 意义截然不同。

2,str1是否等于str2,需要看编译器,编译器可以选择把前后两个"abc"放在不同的位置,也就是说内存中有两个拷贝,这样str1 和 str2分别指向不同的地址;也可以…
[/Quote]

第2条的话我觉得大多数编译器会做优化,只会存储一份常量

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧