簡體   English   中英

C ++中2D數組的指針?

[英]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.

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