我的编译器是g ++ 4.7.3
long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);
结果是
i=0xbfd78760 lref=0xbfd78760 iref=0xbfd78764
为什么iref
的地址高于i
我认为它可能是这样的:
当const int&
引用long
时,就像
int temp = i
const int& iref = temp;
=============================================== ===========
CODE2
然而当代码如
long i = 2222;
const long& lref = i;
const int& iref = i;
int a = 10;
int b = 10;
printf("i=%p lref=%p iref=%p a=%p b=%p\n", &i , &lref, &iref, &a, &b);
结果是
i=0xbfade768 lref=0xbfade768 iref=0xbfade774 a=0xbfade76c b=0xbfade770
为什么a
和b
的地址低于堆叠中的iref
?
=============================================== ===========
CODE3
当代码如
long i = 2222;
const long& lref = i;
const int& iref = i;
printf("i=%p lref=%p iref=%p \n", &i , &lref, &iref);
结果是
i=0xbfbe3f84 lref=0xbfbe3f84 iref=0xbfbe3f83
如果iref
的类型为char
,为什么iref
的地址低于i
?
有人可以告诉我为什么,谢谢你!
答案 0 :(得分:2)
你的直觉是正确的,iref
确实是一个临时的单独记忆位置。
内存地址的顺序取决于编译器,显然代码生成就像这样对堆栈进行了排序。为什么g ++命令这样我不知道 - 你可能需要深入研究g ++内部文档甚至源代码。
但请记住,在大多数系统上,如果堆栈上的地址较低,则意味着堆栈中的值更高,因为堆栈通常会向下增长。
答案 1 :(得分:0)
long i = 2222;
const long& lref = i;
此处,引用类型与对象类型匹配,因此lref
可以是对i
的引用。因此,您会看到两者的地址相同。
const int& iref = i;
此处,类型不匹配,因此iref
无法直接引用i
。人们可能会认为这会给出错误;但是,该语言存在两个漏洞:
i
可以转换为int
类型的临时用户;和(可能令人惊讶的)结果是iref
引用了一个单独的值,其地址与i
不同。