【问题标题】:Calling Funcs with Pointer Params vs Reference Params [duplicate]使用指针参数与参考参数调用函数 [重复]
【发布时间】:2013-12-09 18:21:24
【问题描述】:

我希望有人可以向我解释为什么会调用带有引用参数的函数而不是带有指针参数的函数,如下所示:

int Func1 ( int & a );
int Func1 ( int * a );

int main()
{
   int y = 1;
   int & x = y;
   int * z = & y;

   Func1(y); // Calls reference version
   Func1(&y); // Calls pointer version
   Func1(z); // Calls pointer version

   return 0;
}

int Func1 ( int & a )
{
    cout << "Reference param Func1 called" << endl;
    a = a + 1;

    return a + 1;
}

int Func1 ( int * a )
{
    cout << "Pointer param Func1 called" << endl;
    *a = *a + 1;

    return *a + 1;
}

我很困惑如何决定为 Func1(&y) 调用调用 Func1 的指针参数版本而不是 Func1 的引用参数版本。另外,为什么没有为 Func1(z) 调用选择 Func1 的参考参数版本?如果 z 持有地址,我不明白为什么不能将地址传递到 Func1( &a ) 的引用参数中。

【问题讨论】:

  • 关于类型,z的类型是指针。
  • 啊,我明白了。所以 Func1( int & a ) 创建一个引用,它不接收地址作为传递的参数,而 Func1( int * a ) 接收地址作为传递的参数,可以是 &y 或 z 的形式,其中 z是指针吗?
  • @Caulibrot:&amp;y一个指针。所以这是一个“z,z是指针”的例子。
  • 如果 &y 是一个指针,它作为指针的作用域仅仅是从它被传递到它被接收到的时间吗?我知道 y 在 main 中具有本地范围,但我不确定何时创建和销毁 &y 作为指针。
  • @Caulibrot: &amp;y 是一个标量类型的右值,这意味着它是一个没有(就标准而言)内存中任何特定位置的值。在这方面,它与来自y+1 的值相同。它没有范围(因为名称有范围,对象和值没有)。它也没有真正的生命周期,对象有生命周期。它只是用于在int Func1(int *a) 中初始化变量a 的值。那么a 的范围和持续时间都是“直到调用返回”。

标签: c++ pointers reference function-calls


【解决方案1】:

int Func1 ( int &amp; a ); 匹配参数表达式类型为 int 的调用(并且有资格对其进行非常量引用)。 int Func1 ( int * a ); 匹配参数表达式类型为 int* 的调用。

如果 z 持有地址,我不明白为什么不能将地址传递到 Func1( &a ) 的引用参数中。

嗯,你可以通过调用Func1(*z)来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2014-07-16
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多