动态分配的数组通过引用传输到函数

时间:2016-02-03 10:10:02

标签: c++

我无法通过引用将动态分配的数组传递给函数。 "数组应通过引用"传输到函数。 我的程序应该采用n个整数并找出最小值。应将该最小值添加到用户输入的所有阵列中。但BY REFERENCE部分让我失望。我试过(int& x [],int& n)但是失败了。 请帮助,非常感谢。

void add_min(int x[], int n)
{
    int add[n];
    int mini = x[0];
    int i;

    for(i = 0; i < n; i++)
    {
        if(x[i] < mini)
        {
            mini = x[i];
        }
    }

    for(i = 0; i < n; i++)
    {
        add[i] = x[i] + mini;
    }

    for(i = 0; i< n ; i++)
    {
        cout<<add[i]<<endl;
    }
}

int main()
{
    int *x;
    int n;
    cout<<"Enter the amount of integers"<<endl;
    cin>>n;
    x = new int[n];

    cout<<"Enter the integers"<<endl;
    for(unsigned i = 0; i < n; i++)
    {
        cin>>x[i];
    }

    add_min(x,n);

    delete x;

    return 0;
}

3 个答案:

答案 0 :(得分:2)

动态分配的数组不能在命名变量中,也不能引用一个。

当你调用new[]时,数组被分配在内存中的某个地方,并且该调用返回该数组中第一个对象的地址。您将地址存储在指针变量中。指针不是数组,只是指向第一个元素。

您可以通过引用传递指针,如下所示:

void foo(int*& ptr)

如果您的作业要求您通过引用传递数组,那么您可能无法动态分配数组。在这种情况下,这就是您将参数声明为对数组的引用的方式:

void foo(int (&arr)[10])

请注意,必须在编译时知道大小。您可以使用模板参数为不同大小的数组生成函数。

如果赋值确实要求您动态分配数组,那么它们可能会让您通过引用传递指针。

答案 1 :(得分:0)

我在这里看到的问题是通过引用传递以下内容:

  

动态分配数组

动态分配的唯一方法是通过返回指针。您正确猜到的将数组传递给函数的语法是:

void add_min(int x[], int n) { ... }

当然,您可以将数组视为指针,然后得到:

void add_min(int* x, int n) { ... }

现在出现了引用

的问题

通过引用应用程序传入数组的语法是:

void add_min(int (&x)[3]) { ... }

但在这种情况下,您需要实际知道它的大小,因此不会动态分配数组。

为了避免了解数组大小的需要,我们可以做一些模板魔法,比如:

template<int n>
void add_min(int (&x)[n]) { ... }

但同样,这需要使用静态分配的数组(int x[124])调用,而不是动态数组。

但是数组总是通过引用传入,它们永远不会被复制到堆栈中,所以你的代码版本是正确的。

答案 2 :(得分:0)

首先,您使用的是C ++,因此您不应该使用指针std::vector。它会更容易,你不会造成内存泄漏。

其次,你传递指针,而不是数组。不一样:https://stackoverflow.com/a/1641963/1351828

所以你要指向第一个元素的指针。如果您想更改&#39;数组&#39;你可以按值传递指针。如果你想分配新的阵列&#39;并在函数中更改它,通过引用传递指针:

void add_min(int &x[], int n)