2012-02-02 65 views
3

我只是偶然在下面的代码行为什么我可以获取字符串文字的地址,但不是整数文字的地址?

cout << &"Blahh" << endl; 

编译器不会给出错误并在控制台上显示的地址。它工作正常,没有任何问题。如果我用int替换“Blahh”,那么

cout << &10 << endl; 

代码将不会编译。简而言之:一个字符串文字可以工作,但不是整数字面值。

cout << &"Blahh" << endl;的工作原理和cout << &10 << endl;的原因是什么?

+3

简短回答:'10'是一个右值,''Blahh“'是一个左值。 – ildjarn 2012-02-02 17:02:35

+3

“代码不会编译”的另一种说法是没有提到编译器或错误消息。人们会不会学习? – abelenky 2012-02-02 17:02:55

+2

@abelenky:你是指个体,还是整个人类从遗传角度演化出来,从出生时就知道这很烦人? – 2012-02-02 17:06:33

回答

4

因为"Blahh"在内存中有一个地址(它是一个l值)。 10不(这是一个r值)。

http://en.wikipedia.org/wiki/Value_%28computer_science%29

+5

“*'10'将直接进入寄存器*”与C++无关。 – ildjarn 2012-02-02 17:03:38

+0

Pfft - 我想你是对的。编辑。 – 2012-02-02 17:06:30

+4

虽然问题是*为什么*是''Blahh'''如果'10'不是。这个答案澄清了术语,但没有解释。 – 2012-02-02 17:06:51

4

字符串文字如"Blahh"const char[6]类型的,因此已经在存储器的地址空间分配给它。整数字面常量10没有分配给它的特定内存位置,因此无法获取其地址(如同您想要改变程序中常数10的值一样)。

+4

顺便说一句,想象一下如果你可以在程序中改变''Blahh''的值。 – 2012-02-02 17:27:53