BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #71799同步于 2013/6/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

指针问题

century
2013/6/15镜像同步9 回复
#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"
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
huangzz机器人#1 · 2013/6/15
先说输出"12yes":这是编译器的实现,有一个字符串"abc",然后把p1和p2指过去,当对p1或p2有改动的时候才会重新生成新的字符串,并给其新的地址,所以这里"p1 == p2"为真。 而不输出"34yes",是因为p3和p4是不同的字符数组,首地址肯定不一样,所以"p3 == p4"为假。
lanphon机器人#2 · 2013/6/15
【 在 century 的大作中提到: 】 : [code=c] : #include "iostream" : using namespace std; : ................... p1和p2指向同一个字符串常量,其值自然一样 p3和p4是数组名称,当指针来用的时候,指向不同的存储区域,值当然就不一样了
century机器人#3 · 2013/6/15
p1不是字符串第1个元素的地址吗 难道p1的地址和p2的地址一样? 【 在 lanphon 的大作中提到: 】 : p1和p2指向同一个字符串常量,其值自然一样 : p3和p4是数组名称,当指针来用的时候,指向不同的存储区域,值当然就不一样了
shenlei机器人#4 · 2013/6/15
第一个第二个abc放在常量区,一个地方,所以p1==p2 【 在 century (century) 的大作中提到: 】 : p1不是字符串第1个元素的地址吗 难道p1的地址和p2的地址一样?
lanphon机器人#5 · 2013/6/15
【 在 century 的大作中提到: 】 : p1不是字符串第1个元素的地址吗 难道p1的地址和p2的地址一样? 对的,“123”是常量,p1和p2都指向这个字符串
xxpxxxxp机器人#6 · 2013/6/15
p1、p2的"abc"放在了程序的字符常量区,然后将p1、p2指向了其内存位置。在编译器(默认)启用“字符串池”优化技术的情况下,由于二者内容相同,编译器只会为"abc"分配一个实例,这样使得p1、p2值相同了。 在VS里,关闭“字符串池”优化技术(项目属性-C/C++-代码生成-启用字符串池),即使二者内容相同,编译器也会为其生成不同实例,这样p1、p2就不同了。 而数组赋值只是使用该字符串进行数组初始化而已,p3、p4会在栈上分别开辟空间,地址自然不同。
ashi0808机器人#7 · 2013/6/15
对于p1和p2,它们是指针,被赋值后存的是字符串常量“abc”的地址,它们显然相等。但是对于p3和p4,它们是字符数组,被赋值以后存的是字符串“abc”的实际内容,而数组名实际上等价于数组的起始地址,而p3和p4是两个不同的字符数组,它们的起始地址不一样。
tootwo机器人#8 · 2013/6/15
你先看看p3==p4吗?
q397273499机器人#9 · 2013/6/15
建议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; : ...................