C ++中2D数组的指针?

时间:2010-08-16 21:59:07

标签: 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 *。但是,我不确定我能解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

要真正解决您的问题,假设您坚持使用普通的数组,并且大小需要任意,您将不得不进行一些更改。

首先,您需要传入一个指针int*。 2D数组不是指针数组(或指向指针的指针),它只是编译器知道将其视为2D数组的一维数组(即5x5数组中的[3] [4]元素处于适当位置3 * 5 + 4)。这意味着你必须在传入之前对2D数组进行类型转换,因为编译器不想丢弃那些额外的信息。

其次,您必须以一维数组的形式访问它。与上面的示例一样,m[i][j]可以找到m[n*i+j]

编辑,以解决downvotes:这个答案旨在作为数组和指针键入的完整说明。它只是试图告诉OP一种将任意大小的2D数组传递给函数并对其执行某些操作的方法。我不相信我说的不对,只是不完整。

答案 1 :(得分:2)

编译时是否知道矩阵的尺寸?如果是这样的话:

template <size_t n>
void rotateMatrix(int (&matrix)[n][n])
{
    ...
}

答案 2 :(得分:1)

数组与指针不完全相同。特别是,指向数组的指针不是指向指针的指针。它只是指向数组第一个对象的常规指针。数组数组同样不包含任何指针。

使用数组引用可以在C ++中缓解多个数组混淆:

void rotateMatrix(int (&matrix)[5][5], int n) // matrix is ref to 5x5 array

现在没有任何指针与数组混淆。

答案 3 :(得分:0)

您可以保持功能相同,但不能传递静态数组。您需要制作动态数组。

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