返回信息流#include "iostream"
using namespace std;
int main(int argc, char const *argv[])
{
char *p1 = "abc";
char *p2 = "abc";
char p3[] = "abc";
char p4[] = "abc";
if(p1 == p2){
cout<<"12yes"<<endl;
}
if(p3 == p4){
cout<<"34yes"<<endl;
}
return 0;
}
为什么只输出"12yes",不输出"34yes"
这是一条镜像帖。来源:北邮人论坛 / cpp / #71799同步于 2013/6/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
指针问题
century
2013/6/15镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
先说输出"12yes":这是编译器的实现,有一个字符串"abc",然后把p1和p2指过去,当对p1或p2有改动的时候才会重新生成新的字符串,并给其新的地址,所以这里"p1 == p2"为真。
而不输出"34yes",是因为p3和p4是不同的字符数组,首地址肯定不一样,所以"p3 == p4"为假。
【 在 century 的大作中提到: 】
: [code=c]
: #include "iostream"
: using namespace std;
: ...................
p1和p2指向同一个字符串常量,其值自然一样
p3和p4是数组名称,当指针来用的时候,指向不同的存储区域,值当然就不一样了
p1不是字符串第1个元素的地址吗 难道p1的地址和p2的地址一样?
【 在 lanphon 的大作中提到: 】
: p1和p2指向同一个字符串常量,其值自然一样
: p3和p4是数组名称,当指针来用的时候,指向不同的存储区域,值当然就不一样了
第一个第二个abc放在常量区,一个地方,所以p1==p2
【 在 century (century) 的大作中提到: 】
: p1不是字符串第1个元素的地址吗 难道p1的地址和p2的地址一样?
【 在 century 的大作中提到: 】
: p1不是字符串第1个元素的地址吗 难道p1的地址和p2的地址一样?
对的,“123”是常量,p1和p2都指向这个字符串
p1、p2的"abc"放在了程序的字符常量区,然后将p1、p2指向了其内存位置。在编译器(默认)启用“字符串池”优化技术的情况下,由于二者内容相同,编译器只会为"abc"分配一个实例,这样使得p1、p2值相同了。
在VS里,关闭“字符串池”优化技术(项目属性-C/C++-代码生成-启用字符串池),即使二者内容相同,编译器也会为其生成不同实例,这样p1、p2就不同了。
而数组赋值只是使用该字符串进行数组初始化而已,p3、p4会在栈上分别开辟空间,地址自然不同。
对于p1和p2,它们是指针,被赋值后存的是字符串常量“abc”的地址,它们显然相等。但是对于p3和p4,它们是字符数组,被赋值以后存的是字符串“abc”的实际内容,而数组名实际上等价于数组的起始地址,而p3和p4是两个不同的字符数组,它们的起始地址不一样。
建议lz这样输出来研究一下?
cout<<&p1<<endl;
cout<<&p2<<endl;
cout<<&p3<<endl;
cout<<&p4<<endl;
cout<<hex;
cout<<(int)p1<<endl;
cout<<(int)p2<<endl;
cout<<(int)p3<<endl;
cout<<(int)p4<<endl;
【 在 century 的大作中提到: 】
: [code=c]
: #include "iostream"
: using namespace std;
: ...................