如何通过引用传递数组?

时间:2015-03-28 11:44:22

标签: c++ arrays pointers reference

我想通过引用将数组传递给函数。该函数将动态分配元素。

此代码向我显示错误消息:access violation

#include <iostream>
using namespace std; 

void func(int* ptr)
{
    ptr = new int[2]; 
    ptr[0] = 1; 
    ptr[1] = 2; 
}

void main()
{ 
    int* arr = 0;
    func(arr);
    cout << arr[0] << endl; // error here 
}

2 个答案:

答案 0 :(得分:3)

C ++按值传递参数。如果你想通过引用传递int指针,你需要告诉C ++类型是&#34;引用指向int&#34;:int*&的指针。

因此,你的函数原型应该是

void func(int*& ptr);

请注意,您仍然没有处理指针或对数组的引用,而是指向第一个元素的指针,该元素很接近但不相同。

如果您真的想通过引用传递大小为2的数组,那么您的函数原型将如下所示:

void func(int(&my_array)[2]);

答案 1 :(得分:0)

首先,函数main应具有返回类型int

至于你的问题,你要么必须通过引用传递指针,要么将指针传递给指针。或者你可以简单地从函数返回指针。

这是一个展示三种方法的示范程序。考虑到您可以使用智能指针std::unique_ptr

#include <iostream>

int * func()
{
    int *ptr = new int[2]; 

    ptr[0] = 1; 
    ptr[1] = 2; 

    return ptr;
}

void func( int **ptr )
{
    delete [] *ptr;

    *ptr = new int[2]; 

    ( *ptr )[0] = 3; 
    ( *ptr )[1] = 4; 
}

void func( int * &ptr )
{
    delete [] ptr;

    ptr = new int[2]; 

    ptr[0] = 5; 
    ptr[1] = 6; 
}

int main()
{ 
    int *arr = func();

    std::cout << arr[0] << ", " << arr[1] << std::endl;

    func( &arr );

    std::cout << arr[0] << ", " << arr[1] << std::endl;

    func( arr );

    std::cout << arr[0] << ", " << arr[1] << std::endl;

   delete [] arr;
}

还有一个使用std::unique_ptr

的例子
#include <iostream>
#include <memory>

std::unique_ptr<int[]> func()
{
    std::unique_ptr<int[]> p( new int[2] );

    p[0] = 1; 
    p[1] = 2; 

    return p;
}

void func( std::unique_ptr<int[]> &p )
{
    p.reset( new int[2] );

    p[0] = 3; 
    p[1] = 4; 
}


int main()
{ 
    std::unique_ptr<int[]> p = func();

    std::cout << p[0] << ", " << p[1] << std::endl;

    func( p );

    std::cout << p[0] << ", " << p[1] << std::endl;
 }

正如您在本案中所看到的,您无需担心调用运算符delete []