簡體   English   中英

C ++動態/靜態數組作為函數的參數

[英]C++ Dynamic/Static arrays as parameters to functions

我一直在嘗試使用2D數組作為C ++類中構造函數的參數。

標頭:

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

如果我只是繼續對新數組和初始化子數組進行常規調用,將指針傳遞給構造函數,那么我想的一切都很好,我是否可以使用初始化函數創建靜態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聲明為double A[][] ,即使我指定了所有值,為什么也必須指定第二維。

數組確實會轉換為指針,但僅適用於一個級別。 數組數組不會轉換為指向指針的指針。

數組可以轉換為指針,因為指針仍然提供查找數組值的合理方法,但是數組的數組與指針的指針本質上是不同的。 數組的數組連續存儲在內存中。 例如,如果您具有如下定義:

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}};

可以保留第一個維度的大小,因為編譯器會為您填充它,但這僅適用於一個級別。 原則上,編譯器可以很好地猜測其他維度應該是什么,但這實際上是語言中的一個獨立規則。

如果您確實希望能夠傳遞2D數組,則可以使用如下模板化的構造函數來實現:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM