是否有其他方法在函数中传递数组?

时间:2012-10-18 08:26:53

标签: c++

  

可能重复:
  passing 2D array to function

我的问题与将数组作为C ++函数参数传递有关。让我先说明一下这个例子:

void fun(double (*projective)[3])
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            projective[i][j]= i*100+j;
        }
}

int main()
{
    double projective[3][3];     

    fun(projective);
    for(int i=0; i<3; i++)
    {
        cout<<endl;
        for(int j=0; j<3; j++)
            cout<<projective[i][j]<<"   ";
    }


    return 0;
}

在这个例子中,fun的传递参数是一个数组,我想知道是否还有其他传递这个参数的方法。谢谢!

3 个答案:

答案 0 :(得分:3)

fun采用指向3的数组的指针,它假定(依赖于调用者)这指向至少3个数组-3的数组的第一个元素双打。它的作用,因为你说main中提供给调用的参数是一个数组。这会立即衰减到指向其第一个元素的指针。

一个替代方案是fun采用指向3x3-double-double的指针,因为它无论如何都假定大小而且调用者确实有这样的野兽:

void fun(double (*p_projective)[3][3])
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            (*p_projective)[i][j]= i*100+j;
        }
}

使用fun(&projective)调用它。

答案 1 :(得分:1)

你不能这样传递数组,它总是衰减到一个指针。但是如果你用一个结构包装它就可以传递一个数组。这适用于C和C ++。在C ++中,您可以传递对数组的引用。在这两种情况下,阵列都是固定大小。

// as a struct
struct Array
{
  int elems[10];
};

void func(Array a);

// as a reference
void func(int (&a)[10]);

答案 2 :(得分:1)

如果您如此倾向,您也可以使用基指针并自行执行偏移,假设您的数组已分配或声明为具有暗淡*暗淡的元素。

void fun(double *projective, size_t dim)
{
    for(size_t i=0; i<dim; i++)
        for(size_t j=0; j<dim; j++)
            projective[i*dim+j] = i*100+j;
}

int main(int argc, char *argv[])
{
    double ar[5*5];
    fun(ar, 5);
    return 0;
}

有很多方法可以做到这一点,这只是一个,但通常最容易缠绕我的头(我通常使用std :: vector&lt;&gt;作为后端)。