C中矩阵实现之间的差异

tem*_*mpy 5 c matrix

我用两种不同的方式在C中创建了两个2D数组(矩阵).
我不明白它们在内存中的表示方式之间的区别,以及我不能以相同的方式引用它们的原因:

scanf("%d", &intMatrix1[i][j]); //can't refer as  &intMatrix1[(i * lines)+j])

scanf("%d", &intMatrix2[(i * lines)+j]); //can't refer as &intMatrix2[i][j])
Run Code Online (Sandbox Code Playgroud)

这两个数组的实现方式有何不同,为什么我必须以不同的方式引用它们?

如何以相同的方式(??????在我的printMatrix函数中)引用每个数组中的元素?

int main()
{
   int **intMatrix1;
   int *intMatrix2;

   int i, j, lines, columns;

   lines = 3;
   columns = 2;

   /************************* intMatrix1 ****************************/

   intMatrix1 = (int **)malloc(lines * sizeof(int *));

   for (i = 0; i < lines; ++i)
      intMatrix1[i] = (int *)malloc(columns * sizeof(int));

   for (i = 0; i < lines; ++i)
   {
       for (j = 0; j < columns; ++j)
       {
       printf("Type a number for intMatrix1[%d][%d]\t", i, j);
       scanf("%d", &intMatrix1[i][j]); 
       }
   }

   /************************* intMatrix2 ****************************/ 

   intMatrix2 = (int *)malloc(lines * columns * sizeof(int));

   for (i = 0; i < lines; ++i)
   {
       for (j = 0; j < columns; ++j)
       {
       printf("Type a number for intMatrix2[%d][%d]\t", i, j);
       scanf("%d", &intMatrix2[(i * lines)+j]);
       }
   }

   /************** printing intMatrix1 & intMatrix2 ****************/

   printf("intMatrix1:\n\n");
   printMatrix(*intMatrix1, lines, columns);

   printf("intMatrix2:\n\n");
   printMatrix(intMatrix2, lines, columns);
}


/************************* printMatrix ****************************/

void printMatrix(int *ptArray, int h, int w)
{
    int i, j;

    printf("Printing matrix...\n\n\n");

    for (i = 0; i < h; ++i)
        for (j = 0; j < w; ++j)
        printf("array[%d][%d] ==============> %d\n, i, j, ??????);
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ash 5

你要解除引用Matrix1两次..

Matrix1[i][j] ;
Run Code Online (Sandbox Code Playgroud)

这意味着它是一个2D数组或像这样声明的双指针.

int **Matrix1 ;
Run Code Online (Sandbox Code Playgroud)

A double pointer可以被认为是指针数组.它的每个元素都是一个指针本身,所以它被解除引用一次到达指针元素,并且解引用两次以访问该成员指针或数组的数据成员.你写的这个陈述等同于这一个......

Matrix1[i][j] ;   //is ~ to

*( *(Matrix1 + i) + j) ;
Run Code Online (Sandbox Code Playgroud)

对于像这样的单个指针.

int *Matrix2 ;
Run Code Online (Sandbox Code Playgroud)

你可以这样只去一次它.

Matrix2[i] ;  //is ~ to
*(Matrix2 + i) ;
Run Code Online (Sandbox Code Playgroud)

你写的这句话..

Matrix2[(i * lines)+j] ;
         |-----------|
Run Code Online (Sandbox Code Playgroud)

此部分评估为单个数字,因此它会解除一次.

(i * lines) + j ;
Run Code Online (Sandbox Code Playgroud)

至于你的printmatrix()函数,ptArray传递给它的是一个单指针.所以你不能两次取消引用它.

也许你可以从我的答案中更好地理解静态和动态2D数组.

2D数组作为函数的参数