1

可能重复:
将二维数组传递给函数

我的问题与将数组作为 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;
}

在示例中,传递参数 forfun是一个数组,我想知道是否还有其他方法可以传递此参数。谢谢!

4

3 回答 3

3

fun接受一个指向 3-double 数组的指针,并假设(依赖于调用者) this 指向至少 3 个 3-double 数组的数组的第一个元素。它确实如此,因为正如您所说,提供给调用的参数main是一个数组。这立即衰减为指向其第一个元素的指针。

一种替代方法是fun采用指向 3x3-array-of-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)

于 2012-10-18T08:36:02.340 回答
1

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

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

void func(Array a);

// as a reference
void func(int (&a)[10]);
于 2012-10-18T08:32:42.963 回答
1

如果您愿意,也可以只使用基指针并自己进行偏移,假设您的数组已分配或声明为具有 dim*dim 元素。

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<> 作为后端)。

于 2012-10-18T08:41:10.380 回答