C++两个指针相比较的问题

楚兴 发布于 2014/09/19 16:01
阅读 1K+
收藏 0

两个指针进行比较,比较的是什么内容?

char* p="aaa";
char* q="aaa";
cout<<boolalpha<<(p==q)<<endl;
cout<<boolalpha<<(*p==*q)<<endl;

int a=1;
int b=1;
int* m=&a;
int* n=&b;
cout<<boolalpha<<(m==n)<<endl;
cout<<boolalpha<<(*m==*n)<<endl;

以上代码输出结果为true;true;false;true;麻烦解释一下结果

加载中
1
梁小刚
梁小刚

看一下这个程序截图:

汇编后的代码:

gaoylss08
gaoylss08
一个在栈上分配内存。 一个是在静态区分配内存。(?)
0
Ethan丶Lee
Ethan丶Lee

char* p="aaa"; p指向常量"aaa",也就是p的值为常量"aaa"的地址。

同理,q的值也为常量"aaa"的地址。

so,p == q 为true。

*p = 'a'

*q = 'a'

*p == *q 等同 'a' == 'a'

so, *p == *q为true.

m为变量a的地址,n为变量b的地址

a的地址不等b的地址,

so,m != n

*m = 1, *n = 1

so,*m == *n 为1 == 1,true

z1y1m1
z1y1m1
回复 @solookin : 其实就连Java都使用的是这种机制。如果用new,此"aaa"就非彼"aaa"了
平原君
平原君
这个是编译器优化
solookin
solookin
为什么不会创建两个 "aaa" ? 此aaa一定是彼aaa 吗?
0
Micooz
Micooz
主要是第一个,其他都显而易见不用说了。编译器遇到相同的常量字符串时,在符号表中只会保存一份,因为既然是常量那就约定的不能改变。如果保存两份,那就浪费了资源。
Force武装卫队
Force武装卫队
最好加个 const限定,不然指针可以改变的
0-1
0-1
+1, 字符串常量,静态存储区,内存中只存一份拷贝,提高效率,只读
0
二的思维
二的思维
指针而已,debug几次就明白了
0
临峰不畏
临峰不畏
第一个为什么为true,是因为p,q都指向“aaa”,虽然我们在程序里写了两遍,编译器在编译时为了节省空间,将这两个“aaa”在编译时被存放在同一块内存。所以(p==q)为true。我们可以试一下将第二个“aaa”改成别的如“aab”,(p==q)一定为false。 之于为什么m==n为什么又为false,是因为a与b是在空间里分配的两块不同的内存空间,所以地址当然不同了。 你如果学过汇编语言,你就很容易理解了。
返回顶部
顶部