传递多维数组的符号最简洁的方法

时间:2014-12-11 17:01:51

标签: c multidimensional-array

我正在研究我在网上发现的这些问题,并且要求就地旋转二维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()时,编译器会抱怨,因为从数组到指针的双指针转换。我的问题如下:

  1. 声明rotate()函数类型的正确方法是什么。

  2. 我怎样才能在函数rotate()中使用s [i] [j]表示法而不必使用指针算法?我意识到类型必须能够以某种方式动态地考虑n的值,所以它可能吗?

  3. 我知道我可以通过定义一对内联getter和setter函数来避开丑陋的符号,但这需要输入太多。

1 个答案:

答案 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 ;