我正在研究我在网上发现的这些问题,并且要求就地旋转二维NxN阵列。我的代码如下:
#include <stdio.h>
void rotate(int n, int *s)
{
int nx, ny, tmp;
int i, j;
if(n < 1) return;
/* Compute upper small square as basis for trajectories */
if(n % 2 == 0) {
nx = ny = n/2;
}
else {
ny = (n-1)/2;
nx = ny+1;
}
/* Move elements along their trajectories */
for(i = 0; i < nx; i++) {
for(j = 0; j < ny; j++) {
tmp = *(s + n*j + n-1-i);
*(s + n*j + n-1-i) = *(s + n*(n-1-i) + n-1-j);
*(s + n*(n-1-i) + n-1-j) = *(s + n*(n-1-j) + i);
*(s + n*(n-1-j) + i) = *(s + n*i + j);
*(s + n*i + j) = tmp;
}
}
}
int main(void)
{
int test[4][4] = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12},
{ 13, 14, 15, 16}};
int n = 4;
int i, j;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
printf("%d ", test[i][j]);
}
printf("\n");
}
printf("\nRotating matrix in place...\n\n");
rotate(n, test);
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
printf("%d ", test[i][j]);
}
printf("\n");
}
return 0;
}
我知道当我在main()函数中将二维数组传递给rotate()时,编译器会抱怨,因为从数组到指针的双指针转换。我的问题如下:
声明rotate()函数类型的正确方法是什么。
我怎样才能在函数rotate()中使用s [i] [j]表示法而不必使用指针算法?我意识到类型必须能够以某种方式动态地考虑n的值,所以它可能吗?
我知道我可以通过定义一对内联getter和setter函数来避开丑陋的符号,但这需要输入太多。
答案 0 :(得分:1)
将其他参数与指针一起传递给数组:
void Func( size_t y , size_t x , int(*a)[x] ) {...
这与
相同void Func( size_t y , size_t x , int a[][x] ) {...
或
void Func( size_t y , size_t x , int a[y][x] ) {...
除最外层之外,必须为a
提供所有尺寸。在这种情况下,y
是可选的。但是你仍然需要它来确定函数中数组的外部大小。
符号与数组相同:
a[y-1][x-1] = 1234 ;