我需要清除一个基本概念。这段代码工作正常。有人可以解释一下,如果函数calDouble已经返回int的地址(引用),为什么我需要使用&进一步在main int * j =& calDouble(i);获取int的地址(引用)?感谢。
int& calDouble(int x)
{
x = x*2;
return x;
}
int main(int argc, char *argv[])
{
int i = 99;
int *j = &calDouble(i);
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:3)
int& calDouble(int x)
不会返回地址,而是返回int
的引用。
您需要获取引用的地址才能将其分配给指针。
但请注意,您的代码会调用未定义的行为。因为您通过值传递参数,所以在函数内部创建了它的副本。所以你通过引用返回一个局部变量,这是不合法的。
我认为你的困惑来自&
。这可以通过两种方式使用:
&x
,它的地址为int& x
中,它定义了引用引用只是一个别名,变量的名称不同。
int x = 0;
int& y = x;
现在,x
和y
引用相同的变量。
int* z = &x;
取x
的地址。
答案 1 :(得分:1)
int&
是参考类型。 不地址。
要了解&calDouble(i)
的作用,请考虑我们是否将其分为两个语句:
int& x = calDouble(i);
... = &x;
calDouble()
函数返回一个引用类型,然后前面的&
将地址 - 返回。所以类型现在是int*
,这就是该行编译的原因。
但是,您的程序显示未定义的行为!一旦函数结束,x
中的calDouble()
就会消失。最初存在的值可能仍在内存中,这就是您的程序“正常工作”的原因。但这在生产代码中并不可靠,有一天,完美的工作测试程序可能会在部署的那一刻爆炸。
出于这种不同的原因,返回对局部变量的引用通常是个坏主意。 (你会看到类方法返回对成员数据的引用,只要对象仍然在范围内就可以了,因为这些变量仍然存在。)只需返回常规int
并继续生活。如果您在返回大型对象时真的担心性能,优化编译器可以执行一些return value optimization。