我正在编写一个将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 *。但是,我不确定我能解决这个问题吗?
答案 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);