参考数据类型的&符号是否返回引用本身的地址或它引用的值?

时间:2012-05-04 09:27:09

标签: c++

我希望自己可以自己测试一下,但不幸的是,在我目前的情况下,这是不可能的。有人可以关注这个吗?

4 个答案:

答案 0 :(得分:5)

返回它引用的值的地址。

答案 1 :(得分: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;
}

Executed online, with results

答案 2 :(得分:1)

值的地址。 (没有参考地址这样的东西)

您可以随时查看键盘:http://codepad.org/I1aBfWAQ

答案 3 :(得分:1)

进一步的实验:有在线编译器允许检查中间结果!

将Mahmoud的示例放在Try out LLVM and 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函数的名称非常相似)。

这意味着编译器已经省略了yz变量,没有为它们分配存储空间。

我将免费为您提供装配清单;)