在C ++中通过引用函数背后的原因?

时间:2018-09-29 10:44:45

标签: c++ function pointers heap

我在这里用C ++编码。

int main()
{ 
  int setAcapacity = 10;
  int setANOE = 0;
  int *setA;
  createSet(&setA, setAcapacity);
}

void createSet(int **set, int n)
{
*set = new int[n];

}

有人可以解释一下通过引用传递给createSet函数的原因吗?谢谢!!

2 个答案:

答案 0 :(得分:3)

首先,您不通过引用传递,而是通过指针传递!

通过引用看起来像这样:

int createSet(int*& set, int n)
//                ^ reference to pointer
{
    set = new int[n]; // assign to referenced value
}

createSet(setA, setAcapacity);
//        ^ no need to take address

您希望通过引用或指针传递的原因有两个:

  1. 要传递的对象很大,复制效率很低。在这些情况下,通常需要传递const引用或指向const的指针。
  2. 传递的对象应在函数中进行修改。在您的示例中就是这种情况,在函数外部将新值分配给指针setA,并通过指针将其传递给名为set的指针。

答案 1 :(得分:0)

您在int createSet(int **set, int n)中所做的操作是将指针传递给指针;不是对指针的引用。要传递参考:int createSet(int * & set, int n)

如果通过引用传递,您的代码将如下所示:

void createSet(int * & set, int n) // '&' for reference
{
    set = new int[n];
}

int main()
{
    int setAcapacity = 10;
    int setANOE = 0;
    int *setA = nullptr; // Better to initialize
    createSet(setA, setAcapacity);
}

对于您的问题:传递指针/引用和传递值之间的区别在于,对调用的函数中的指针/引用传递的参数进行的修改在调用函数中有效,而对在调用函数中按值传递的参数不会影响调用函数。您的情况下的#value#是:#int-pointer#。

您将指针/引用传递给#value#,因为您希望赋值定位到调用函数main()的setA。因此,您还要在原始代码中传递setA的地址。因此new可以将新指针存储在该地址中。

此外,在许多情况下:传递引用比传递值更有效,因为它不会复制参数。形式参数是该参数的别名。当被调用函数读取或写入形式参数时,实际上就是对参数本身的读取或写入。