关于const *的问题

Microsues 2010-12-21 03:19:33
先看代码:

void main()
{
char str1[] = "abc";
char str2[]= "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";

cout<< (str1 == str2) <<endl; //输出0
cout<< (str3 == str4) <<endl; //输出0
cout<< (str5 == str6) <<endl; //为什么输出1 ????????????
}
*/

cout<< (str5 == str6) <<endl; 执行完这句为什么输出1 ?
...全文
297 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowzl 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hanyue03 的回复:]

完全是因为优化
[/Quote]

正解
haorengoodman 2010-12-21
  • 打赏
  • 举报
回复
a
0
0
002AFCB4 002AFCA8
1
请按任意键继续. . .
haorengoodman 2010-12-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
//typedef int ARRAY[10];
#include <string>
using namespace std;



void main()
{
char str1[] = "abc";
char *p=str1;
char str2[]= "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
cout<<*p<<endl;
cout<< (str1 == str2) <<endl; //输出0
cout<< (str3 == str4) <<endl; //输出0
cout<<&str5<<" "<<&str6<<endl;
cout<< (str5 == str6) <<endl; //为什么输出1 ????????????
}


结果
sylar_chen 2010-12-21
  • 打赏
  • 举报
回复

1)存储了内置类型的const对象的数组实在自由存储区(堆)分配的空间,str3,str4分配的是不同的空间,当然不等。
delete [] 表达式释放指针所指向的数组空间:
eg: deleted [] pia;

2)str5,str6都是指向一个在全局数据区(静态数据区)的单元("abc")的地址,他们当然相同。

sylar_chen 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]

const char *str5 = "abc";
const char *str6 = "abc";

"abc"是字符串常量,在常量区里,str5和str6都指向"abc",指向的地址一样。

char str1[] = "abc";
char str2[]= "abc";
const char str3[] = "abc";
co……
[/Quote]

这个解释很合理, str3,str4中的const其实只表示他们不能随便修改(用强制转换还是能修改的const_cast),不代表他们也是在全局区分配的。
sylar_chen 2010-12-21
  • 打赏
  • 举报
回复
我用vs2008调试,str5和str6的地址相同。。。。
haorengoodman 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 microsues 的回复:]
先看代码:

C/C++ code

void main()
{
char str1[] = "abc";
char str2[]= "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char ……
[/Quote]


实验结果现实5和6的地址是不行同的,回答要有根据,不能经验主义
haorengoodman 2010-12-21
  • 打赏
  • 举报
回复
实验结果5和6的地址是不同的;楼主还是小心以上各楼的解释。
Rain208 2010-12-21
  • 打赏
  • 举报
回复
比较的是地址

要strcmp比较字符串

两把扇子 2010-12-21
  • 打赏
  • 举报
回复
编译器实现的原因
my1111ym 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luciferisnotsatan 的回复:]
const char *str5 = "abc";
const char *str6 = "abc";

"abc"是字符串常量,在常量区里,str5和str6都指向"abc",指向的地址一样。

char str1[] = "abc";
char str2[]= "abc";
const char str3[] = "abc";
const char str4……
[/Quote]
+1
寂寞的泡面 2010-12-21
  • 打赏
  • 举报
回复
建议楼主看看我写的blog。
http://blog.csdn.net/piaojun_pj/archive/2010/10/23/5960742.aspx
hunjj 2010-12-21
  • 打赏
  • 举报
回复
后面2个地址相同
xhxh12345678 2010-12-21
  • 打赏
  • 举报
回复
"abc"是字符串常量,放在在常量区里,在没有优化时,多个"abc"形成多个常量数据,每个的地址当然不同,但优化后相同的字符串常量会合并为一个,因此指针值相同,在用char str1[]或const char str3[]初始化时,由于str1和str3都是局部数组,数据分配在堆栈区,会从常量区拷贝数据或优化后直接赋值,他们的地址是肯定不同的
nicklisir 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 my_live_123 的回复:]
关键在于运算符“==”,比较的是地址,不比较内容!对于这类指针它比较的他们的指向,前面四个都是各自的内存存储abc,而后面的两个指针str5,str6,实际上指向同一块内存!
[/Quote]
+1
CJBAAA 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 focuslight 的回复:]
const char str3[] = "abc";
const char str4[] = "abc";
这个怎么不在常量区?
[/Quote]
这是个数组赋值语句,当然不在常量区了
一根烂笔头 2010-12-21
  • 打赏
  • 举报
回复
关键在于运算符“==”,比较的是地址,不比较内容!对于这类指针它比较的他们的指向,前面四个都是各自的内存存储abc,而后面的两个指针str5,str6,实际上指向同一块内存!
hanyue03 2010-12-21
  • 打赏
  • 举报
回复
完全是因为优化
Isnis-fallen 2010-12-21
  • 打赏
  • 举报
回复
const char str3[] = "abc";
const char str4[] = "abc";
这个怎么不在常量区?
goodluckme2013 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zeusuperman1 的回复:]
4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
[/Quote]
那个宏也是常量,也在此区吧
加载更多回复(9)

64,654

社区成员

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

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