如何从函数传递数组引用?

时间:2014-05-10 13:45:57

标签: c++

我想通过引用传递函数中的数组值

  1. 我第一次尝试变量(效果很好):

    #include <iostream>
    using namespace std;
    
    int input(int &);
    int main()
    {
        int a;
        input(a);
        cout << "the value : " << a << endl;
        system("pause");
        return 0;
    }
    
    int input(int &a)
    {
        cin >> a;   
    }
    
  2. 但是当我将a更改为 a[] 时,如下面的代码所示, 不起作用

    #include <iostream.h>
    using namespace std;
    
    int input(int &[]);
    int main()
    {
        int a[2], i;
        input(a);
        for(i=0;i<=2;i++)
        {
            cout << a << endl;
        }
    
        system("pause");
        return 0;
    }
    
    int input(int &a[])
    {
        int i;
        for(i=0;i<=2;i++)
        {
            cin >> a[i];
        }  
    }
    

3 个答案:

答案 0 :(得分:2)

此记录

int &[]

表示在C ++中禁止的引用数组。

按以下方式声明函数

void input(int(&amp;)[2]);

此外,您使用的是无效的indeces范围。有效范围是[0,1]。所以函数看起来像

void input( int ( &a )[2] );
{
   for ( size_t i = 0; i < 2; i++ ) std::cin >> a[i]; 
}

您还可以通过以下方式定义功能

void input( int a[], size_t n );
{
   for ( size_t i = 0; i < n; i++ ) std::cin >> a[i]; 
}

并将其命名为

input( a, 2 );

答案 1 :(得分:2)

应该是:

void input(int (&a)[2]);

或只是

void input(int (&)[2]);

但是在函数定义中,您还需要提供数组名称:

void input(int (&a)[2]) {...}

您需要使用(&array)向编译器说明您希望引用数组,而不是(无效)引用数组int &array[2];

并称之为:

input(a);

答案 2 :(得分:1)

返回和获取数组引用的语法是:

template<typename T, size_t N>
T(&do_nothing(T(&arg)[N]))[N]
{
    return arg;
}

或者更简单地使用模板化类型别名:

template<typename T, size_t N> using arrayref = T(&)[N];

template<typename T, size_t N>
arrayref<T, N> do_nothing(arrayref<T, N> arg)
{
    return arg;
}

当您定义了以前的类型别名模板时,使用数组引用变得非常简单,例如:这是你如何声明一个引用两个整数数组的函数:

void give_me_two_ints(arrayref<int, 2> two_ints);

用作:

int a[] = {1,2,3};
for(auto const& i : do_nothing(a)) std::cout << i << "\n";