[英]Pointer of a 2D array in C++?
我正在編寫一個將NxN矩陣旋轉90度的函數。
這是我的功能
// "matrix" is an n by n matrix
void rotateMatrix(int ** matrix, int n)
{
for(int layer=0; layer < n; layer++)
{
int first = layer, last = n - layer -1;
for(int i=0; i<n; i++)
{
int temp = matrix[i][last];
matrix[i][last] = matrix[first][i];
matrix[first][i] = matrix[i][first];
matrix[i][first] = matrix[last][i];
matrix[last][i]=temp;
}
}
}
這是我如何初始化和調用main函數中的函數的方法:
int m[5][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
rotateMatrix(m,5);
我從IDE中得到的是:
> error: cannot convert ‘int (*)[5]’ to
> ‘int**’ for argument ‘1’ to ‘void
> rotateMatrix(int**, int)’
我有點知道為什么錯了,因為“ m”是一個int *。 但是,我不確定是否可以解決此問題?
為了真正解決您的問題,假設您堅持使用簡單的ol'數組,並且大小必須是任意的,則必須進行一些更改。
首先,您只需要傳遞一個指針int*
。 2D數組不是指針(或指向指針的指針)數組,它只是編譯器知道將其視為2D數組的1D數組(即5x5數組中的[3] [4]元素位於3 * 5 + 4)。 這確實意味着您必須在傳遞2D數組之前對它進行類型轉換,因為編譯器不想丟棄這些額外的信息。
其次,您必須將其作為一維數組進行訪問。 像上面的示例一樣,可以在m[n*i+j]
處找到m[i][j]
m[n*i+j]
。
編輯,以解決downvotes:這個答案是不打算作為數組和指針的類型的完整說明。 它只是試圖告訴OP一種將任意大小的2D數組傳遞給函數並對其執行一些操作的方法。 我不相信我說的任何錯誤,只是不完整。
在編譯時是否知道矩陣的尺寸? 如果是這樣的話:
template <size_t n>
void rotateMatrix(int (&matrix)[n][n])
{
...
}
數組與指針並不完全相同。 特別是,指向數組的指針不是指向指針的指針。 它只是指向數組第一個對象的常規指針。 數組的數組同樣不包含任何指針。
通過使用數組引用,可以在C ++中緩解很多數組混亂:
void rotateMatrix(int (&matrix)[5][5], int n) // matrix is ref to 5x5 array
現在沒有任何指針與數組的混淆。
您可以保持函數不變,但是不能傳入靜態數組。您需要制作動態數組。
int size = 5;
int** m;
m = new int**[size];
for (int i =0; i < size; ++i){
m[i] = new int*[size];
}
/* Assign values to every element of m, using a for loop */
rotateMatrix(m, size);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.