【问题标题】:C++ Dynamic/Static arrays as parameters to functionsC++ 动态/静态数组作为函数的参数
【发布时间】:2012-03-22 09:40:49
【问题描述】:

我一直在尝试在我的 C++ 类中使用二维数组作为构造函数的参数。

标题:

Matrix::Matrix(double **initComponents, int rows, int columns)

如果我继续定期调用 new 和初始化子数组,将指针传递给构造函数,这一切都很好,但我在想,我可以用初始化器创建静态 2D 数组并传递一个指向它的指针吗?给构造函数?

double A[][3] = { {2.0, 3.0, 4.0} , {1.0, 3.0, 4.0} , {2.0, 3.0, 4.0} }; 
Matrix *mtx = new Matrix(A, 3, 3);

这不起作用:(

MS Visual Studio 编译器:

" error C2664: 'Matrix::Matrix(double **,int,int)' : cannot convert parameter 1 from 'double [3][3]' to 'double ** "

谁能解释为什么?我认为它会在引用和指针之间进行自动转换。

第二个问题是,为什么我可以将A 声明为双重A[][],为什么我必须指定第二个维度,即使我指定了所有值。

【问题讨论】:

标签: c++ arrays parameters


【解决方案1】:

数组确实会转换为指针,但它只适用于一层。数组数组不会转换为指向指针的指针。

数组可以转换为指针,因为指针仍然提供了一种合理的方式来查找数组的值,但是数组数组与指向指针的指针根本不同。数组数组连续存储在内存中。例如,如果您有这样的定义:

int a[2][2] = {{1,2},{3,4}};

然后a[0][0]存放在第一个内存位置,a[0][1]存放在第二个,a[1][0]存放在第三个,a[1][1 ] 在第四。当你想查找像 a[i][j] 这样的特定元素时,编译器可以计算位置,因为它知道数组的大小:

int value = ((int *)a)[i*2+j];

将此与指向指针的指针进行比较

int a0[2] = {1,2};
int a1[2] = {3,4};
int **a = {a0,a1};

现在,当您使用 a[i][j] 时,编译器无法直接知道在哪里查找。它首先必须查看 a[0] 并查看它指向的位置,然后再查看第二次以找到该值。

int *ap = a[i];
int value = ap[j];

因为编译器必须使用不同的方式来查找数组数组和指向指针的数组中的值,所以不能互换使用它们。

同样,在这样的声明中:

int a[][2] = {{1,2},{3,4}};

可以省略第一个维度的大小,因为编译器会为您填充它,但这仅适用于一个级别。原则上,编译器可以很好地猜测其他维度应该是什么,但这实际上是语言中的一个单独规则。

如果你真的希望能够传递一个二维数组,你可以使用这样的模板化构造函数:

template<int rows, int cols>
Matrix(const double (&initComponents)[rows][cols])
{
  // initialize matrix elements here
}

然后你甚至不需要显式传递大小:

double A[][3] = { {2.0, 3.0, 4.0} , {1.0, 3.0, 4.0} , {2.0, 3.0, 4.0} };
Matrix *mtx = new Matrix(A);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2011-08-08
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多