请教C++中的string, char[],char*的区别 与联系

u010179812 2014-08-31 11:11:36
#include <iostream>

using namespace std;
int main()
{
string a = "a"; //这种应该是在栈中分配空间吧?
char x[] = "a"; //同上吗?
char *y = "a"; //这是在堆上吧?

//下面的结果是true,怎样解释呢?
if(a == x)
{
cout<<"true\n";
}
else
{
cout<<"false\n";
}
//下面这种比较显示结果为false,是因为一个在栈中,一个在堆中吗?
if(x == y)
{
cout<<"true\n";
}
else
{
cout<<"false\n";
}
//下面的结果是true,怎样解释呢?
if(a == y)
{
cout<<"true\n";
}
else
{
cout<<"false\n";
}
return 0;
}
...全文
295 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
passion_wu128 2014-08-31
  • 打赏
  • 举报
回复
C/C++代码中像"a"这样的字符串都会存储在可执行文件常量区,说得更具体一点是pe文件的rdata节,这是只读的。 你可以验证一下: 在你代码中写出*y = 'b'。运行时马上崩溃。 或者你写出
char* p = "hello string";
然后用二进制查看工具搜索exe中的这个字符串地址。再用pe查看工具看下这个地址属于哪个节。 关于pe文件有哪些节你应该清楚把,不清楚的话自己查资料。 由于编译器优化,相同的字符串会存储在相同的地址。现在假设pa指向"a"储存的地址。 变量a,x,y本身都存储在函数栈上,它们地址各不相同。 执行 string a = "a";只是将pa指向的字符串拷贝到string内部的存储空间。 关于string的内部结构,可以参考我的这篇文章: http://blog.csdn.net/passion_wu128/article/details/38353959 执行char x[] = "a";时直接将pa指向的字符串拷贝到x 执行char *y = "a";时没有拷贝,只是将pa的地址赋值给y,两者指向同一个地址。 a==x为什么为true呢? 因为a==x相等于调用string类的operator==操作,你在这一行下断点,调试的时候step into一下就知道了 这个operator==会先将char* 类型的参数构造成一个临时的string对象,然后再比较。所以它实际比较的是字符串。 x == y只是简单的比较x和y表示的地址是否相等,x是栈上的一个数组地址,y是指向“a”的指针,当然不相等。 至于a == y,原理同a==x一样。 是不是一目了然了???
u010179812 2014-08-31
  • 打赏
  • 举报
回复
同时等号同边到底是值比较还是址比较,有点迷糊。
u010179812 2014-08-31
  • 打赏
  • 举报
回复
引用 2 楼 passion_wu128 的回复:
C/C++代码中像"a"这样的字符串都会存储在可执行文件常量区,说得更具体一点是pe文件的rdata节,这是只读的。 你可以验证一下: 在你代码中写出*y = 'b'。运行时马上崩溃。 或者你写出
char* p = "hello string";
然后用二进制查看工具搜索exe中的这个字符串地址。再用pe查看工具看下这个地址属于哪个节。 关于pe文件有哪些节你应该清楚把,不清楚的话自己查资料。 由于编译器优化,相同的字符串会存储在相同的地址。现在假设pa指向"a"储存的地址。 变量a,x,y本身都存储在函数栈上,它们地址各不相同。 执行 string a = "a";只是将pa指向的字符串拷贝到string内部的存储空间。 关于string的内部结构,可以参考我的这篇文章: http://blog.csdn.net/passion_wu128/article/details/38353959 执行char x[] = "a";时直接将pa指向的字符串拷贝到x 执行char *y = "a";时没有拷贝,只是将pa的地址赋值给y,两者指向同一个地址。 a==x为什么为true呢? 因为a==x相等于调用string类的operator==操作,你在这一行下断点,调试的时候step into一下就知道了 这个operator==会先将char* 类型的参数构造成一个临时的string对象,然后再比较。所以它实际比较的是字符串。 x == y只是简单的比较x和y表示的地址是否相等,x是栈上的一个数组地址,y是指向“a”的指针,当然不相等。 至于a == y,原理同a==x一样。 是不是一目了然了???
谢谢,您讲得清楚,我要花点时间学习,对于operator==总是不喜欢,学不清楚它。

64,644

社区成员

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

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