gpt4 book ai didi

c - C中矩阵实现之间的差异

转载 作者:太空狗 更新时间:2023-10-29 14:53:26 28 4
gpt4 key购买 nike

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

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])

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

如何以相同的方式引用每个数组中的元素(?????? 在我的 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, ??????);
}

最佳答案

您正在两次取消引用 Matrix1..

Matrix1[i][j] ;

意思是这样声明的是二维数组或者双指针。

int **Matrix1 ;

双指针 可以被认为是指针数组。它的每个元素本身都是一个指针,因此它被取消引用一次以到达指针元素,并被取消引用两次以访问该成员指针或数组的数据成员。你写的这个语句等同于这个..

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

*( *(Matrix1 + i) + j) ;

对于像这样的单个指针。

int *Matrix2 ;

你只能取消引用一次,就像这样。

Matrix2[i] ;  //is ~ to
*(Matrix2 + i) ;

你写的这份声明..

Matrix2[(i * lines)+j] ;
|-----------|

这部分的计算结果为单个数字,因此取消引用了一次。

(i * lines) + j ;

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

也许您可以从我这里的回答中更好地理解静态和动态二维数组。

2D-array as argument to function

关于c - C中矩阵实现之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12784508/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com