8

我需要明确一个基本概念。这段代码工作正常。有人可以解释一下,如果函数 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;
}
4

2 回答 2

3

int& calDouble(int x)不返回地址,而是对int.

您需要获取引用的地址才能将其分配给指针。

但是请注意,您的代码会调用未定义的行为。因为您按值传递参数,所以会在函数内部创建它的副本。所以你通过引用返回一个局部变量,这是不合法的。

我认为您的困惑来自&. 这可以通过两种方式使用:

  • 应用于变量&x,它获取它的地址
  • 在声明中时int& x,它定义了一个引用

引用只是一个别名,一个变量的不同名称。

int x = 0;
int& y = x;

现在,xy引用相同的变量。

int* z = &x;

采用 的地址x

于 2012-07-07T06:31:55.843 回答
1

int&是引用类型。这不是地址。

要看看有什么&calDouble(i)作用,请考虑我们是否将其分解为两个语句:

int& x = calDouble(i);
... = &x;

calDouble()函数返回一个引用类型,然后前面的函数&获取返回的地址。所以类型是 now int*,这就是编译该行的原因。

但是,您的程序表现出未定义的行为!一旦函数结束,xincalDouble()就会消失。最初存在的值可能仍在内存中,这就是您的程序“工作”的原因。但这在生产代码中是不可靠的,有朝一日,您完美运行的测试程序可能会在部署时崩溃。

出于这种不同的原因,返回对局部变量的引用通常是一个坏主意。(您将看到类方法返回对成员数据的引用,只要对象仍在范围内就可以了,因为这些变量仍然存在。)只需返回一个常规int并继续生活。如果您真的担心返回大对象时的性能,优化编译器可以进行一些返回值优化。

于 2012-07-07T06:37:43.177 回答