【问题标题】:passing statically allocated 2D arrays as function arguments in C将静态分配的二维数组作为 C 中的函数参数传递
【发布时间】:2010-02-16 19:31:52
【问题描述】:

考虑这段代码:


#include <stdio.h>
#define N 5
void printMatrix(int (*matrix)[N],int n)
{
   int i,j;
   for(i=0;i<n;i++){
      for(j=0;j<n;j++)
        printf("%d",matrix[i][j]);
     printf("\n");
   }
}
int main()
{
   int R[N][N]={{1,2,3},{4,5,6},{7,8,9}};
   printMatrix(R,3);
}

这可以正常工作。
现在,我想在单独的源文件中编写处理二维矩阵的函数,并在需要的地方链接它们。
但后来我遇到了函数printMatrix 中的问题,int 的数组大小在编译时需要matrix 指向(即N)。因此,当大小不同时,我的函数在其他情况下将不起作用。

那么,我该如何处理呢?
动态数组是一种解决方案,但我想知道它是否可以使用静态数组来完成。

【问题讨论】:

    标签: c multidimensional-array


    【解决方案1】:

    如果在编译时两个大小都不知道,则不能使用内置的 2D 数组类型。内置二维数组必须至少具有编译时已知的两种大小中的一种。

    如果两个大小都是运行时值,那么您别无选择,只能使用二维数组的“手动”实现,例如指向数组的指针数组。在这种情况下,函数声明可能如下所示(两种替代等效形式)

    void printMatrix(int *const *matrix, int n, int m);
    void printMatrix(int *const matrix[], int n, int m);
    

    要访问数组元素,您仍然可以使用“传统”语法

    matrix[i][j]
    

    数组本身的创建方式如下(一个简单的例子)

    int row0[] = { 1, 2, 3 };
    int row1[] = { 4, 5, 6 };
    
    int *matrix[2];
    matrix[0] = row0;
    matrix[1] = row1;
    
    printMatrix(matrix, 2, 3);
    

    但如果您已经将矩阵实现为内置二维数组

    int matrix[2][3] = { ... };
    

    然后为了能够将其传递给上述函数,您可以通过使用额外的临时“行指针”数组将其“转换”为上述形式

    int *rows[2];
    rows[0] = matrix[0];
    rows[1] = matrix[1];
    
    printMatrix(rows, 2, 3);
    

    【讨论】:

    • @Brian R. Bondy:这是一个错字。我的意思是int *rows[2]。固定的。谢谢。
    【解决方案2】:

    给自己写一个宏:

    #define MAT(i,j) matrix[i*n + j];
    

    并将“矩阵”声明为指向“int”的简单指针。

    【讨论】:

      【解决方案3】:

      自己计算数组索引。这将处理任意二维数组,例如:

      void printMatrix(int *matrix,int n, int m)
      {
         int i,j;
         for(i=0;i<n;i++){
          for(j=0;j<m;j++)
           printf("%d",matrix[m * i + j]);
         printf("\n");
         }
      }
      

      【讨论】:

        【解决方案4】:

        不要尝试将其作为二维数组传递;传递一个指向第一个元素的指针,然后手动计算偏移量:

        void printMatrix(int *a, size_t m, size_t n)
        {
          size_t i,j;
          for (i = 0; i < m; i++)
          {
            for (j = 0; j < n; j++)
            {
              printf("a[%lu][%lu] = %d\n",
               (unsigned long) i, 
               (unsigned long) j, 
               a[i*n+j]); // treat a as 1-d array, compute offset manually
            }
          }
        }
        
        int main(void)
        {
          int arr[5][4];
          ...
          printMatrix(&arr[0][0], 5, 4);
          ...
        }
        

        当然,这仅适用于连续分配的数组。

        【讨论】:

          【解决方案5】:

          虽然语法不完全一样,但这也恰巧有点作用:

          
          #include <stdio.h>
          #define N 5
          void printMatrix(int* row,int n,int sz)
          {
             int i,j;
             int *currRow;
             for(i=0;i<n;i++){
                currRow = row+i*sz;
                for(j=0;j<n;j++)
                  printf("%d",currRow[j]);
               printf("\n");
             }
          }
          int main()
          {
             int R[N][N]={{1,2,3},{4,5,6},{7,8,9}};
             printMatrix(R[0],3,sizeof(R[0])/sizeof(int));
          }
          
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-30
            • 2012-01-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多