【问题标题】:c Functions with arraysc 带数组的函数
【发布时间】:2018-09-06 05:25:39
【问题描述】:

是否可以创建一个处理未定义长度数组的函数?
例如,我编写了这段代码来填充一个 3x3 的矩阵,我想知道是否有办法做到这一点,但使用一个 nxn 的矩阵。

void fillMatrix(double mat[][COLS])
{
    int i,j;    

        printf("Enter the %d matrix elements:\n",COLS*ROWS);
        for(i=0;i<ROWS;i++)
        {
            for(j=0;j<COLS;j++)
            {
                scanf("%lf",&mat[i][j]);
            }                   
        }
        printf("\n");   
}

在这段代码中,我定义了 ROWS=COLS=3。

【问题讨论】:

  • 这个 void fillMatrix(double **mat, int *row, int *col);
  • 函数从不将数组作为参数。当在函数调用中作为参数传递时,数组会衰减为指针。查看一些C reference 站点。

标签: c arrays function multidimensional-array


【解决方案1】:

是的,如果您在将二维数组传递给函数时知道它的列数。您不必事先定义 COL。

void foo(int col, int arr[][col]) {
//Do something
}

【讨论】:

    【解决方案2】:

    你可以试试这个:

    void func(void *data, int row, int col)
    {
        int (*a)[col] = (int(*)[col])data;
        //now you can access a[i][j] with i<row and j<col
        //data must be an continous array
        //replace int with your data type
    }
    

    工作代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int n = 5;
        int (*a)[n];
        int b[5][5];
    
        a = (int(*)[n])b;
        b[0][0]=0;
        b[0][1]=1;
        b[2][1]=111;
        b[1][2]=666;
        b[4][3]=222;
    
        printf("%d\n", a[0][0]);
        printf("%d\n", a[0][1]);
        printf("%d\n", a[2][1]);
        printf("%d\n", a[1][2]);
        printf("%d\n", a[4][3]);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      也许你可以给你的函数fillMatrix(double mat[][COLS])添加一个新参数row,即fillMatrix(double mat[][col], int row)

      另一种方式:

      double** matrix = (double**) malloc(sizeof(double*)*n);
      for(int i = 0; i<n; i++){
          matrix[i] = (double*) malloc(sizeof(double)*n);
      }
      

      然后把函数改成:fillMatrix(double** matrix, int n)

      【讨论】:

        【解决方案4】:

        是否可以创建一个处理未定义长度数组的函数?

        您会更好地了解数组的维度。如果它是一个函数参数,您通常应该在其他参数中传递维度。

        请记住,当作为参数传递时,数组会衰减为指针。还可以查看一些 C reference 站点,稍后参考 C11 标准 n1570

        在你的情况下,你想为你的矩阵定义一个abstract data type(可能是一些opaque pointer)。使用flexible array members 可能很有用。详情见this回复。

        【讨论】:

        • 刚刚看到我可以使用malloc 创建一个为数组保留内存的函数,然后我可以将该函数与我的fillMatrix 一起使用。
        【解决方案5】:

        是的,您可以使用动态内存来做到这一点。

        你会是这样的:

        void fillMatrix(double** mat, int rows, int cols)    {
            int i,j;    
        
            printf("Enter the %d matrix elements:\n",rows*cols);
            for(i=0;i<rows;i++)
            {
                for(j=0;j<cols;j++)
                {
                    scanf("%lf",&mat[i][j]);
                }                   
            }
            printf("\n");   
         }
        

        其中 double** mat 是一个向量向量,您必须使用 malloc 为行和 malloc 为列请求内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-08
          • 2012-07-24
          • 2022-01-17
          • 1970-01-01
          • 2021-07-16
          • 2012-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多