我希望我可以自己测试它,但不幸的是,在我目前的情况下不可能这样做。有人愿意对此有所了解吗?
问问题
627 次
4 回答
5
它返回它所引用的值的地址。
于 2012-05-04T09:29:51.410 回答
4
与指针不同,引用实际上不是对象。它本身没有地址,更容易将其视为编译器随后将解释的对象的别名。
无论如何,您总是可以使用IdeOne在线测试代码
#include <stdio.h>
void func(int &z)
{
printf("&z: %p", &z);
}
int main(int argc, char **argv)
{
int x = 0;
int &y = x;
printf("&x: %p\n", &x);
printf("&y: %p\n", &y);
func(x);
return 0;
}
于 2012-05-04T09:31:50.633 回答
1
进一步的实验:有允许检查中间结果的在线编译器!
以 Mahmoud 在试用 LLVM 和 Clang 页面上的示例为例,我们得到以下 LLVM IR(截断)。
define i32 @main() nounwind uwtable {
%x = alloca i32, align 4
store i32 0, i32* %x, align 4, !tbaa !0
%1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i64 0, i64 0), i32* %x)
%2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str1, i64 0, i64 0), i32* %x)
%3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str2, i64 0, i64 0), i32* %x) nounwind
ret i32 0
}
...语法不太重要,重要的是要注意已声明了一个变量:(%x
其名称与C函数的名称可疑地相似)。
这意味着编译器已经省略了y
andz
变量,没有为它们分配存储空间。
我会为你省去装配清单;)
于 2012-05-04T13:06:47.817 回答
1
值的地址。(没有参考地址之类的东西)
您可以随时查看键盘:http ://codepad.org/I1aBfWAQ
于 2012-05-04T09:30:32.367 回答