c - 如何将二维数组传递给具有行偏移量的函数,如 C 中的 M*i?
问题描述
for(int i=0; i < n; ++i){
//Find the leading element in a+M*i
if(!find_leading_element((a+M*i),n-i,m,&rowLead,&columnLead)){
return;
}
//Get the dividable from a[rowLEad][columnLead]
divide = (double)1/a[rowLead][columnLead];
printf("The divide from current matrix is %d\n\n",divide);
//Swap the current row = i with rowLead in matrix a+M*i
swap_rows((a+M*i),n-i,m,i,rowLead);
}
我正在从事一个小型学校项目,以减少矩阵,但在通过带有偏移量的 2D 数组时遇到了一些麻烦。
我需要find_leading_element
得到一个二维数组并通过指针返回该矩阵中前导元素的行和列。
因此find_leading_element
返回相对于它得到的矩阵的行和列,没关系我稍后会处理它。现在的问题是传递带有行偏移的二维数组。
因此,每次迭代我都会传递矩阵,但会少一行。由于我不能更改 的声明find_leading_element
,所以我需要使用 传递函数double a[][M]
,是否意味着它是按值传递的?
bool find_leading_element(double a[][M], int n, int m, int * row, int * column) {
printf("In Find Leader got the matrix\n");
print_matrix((double (*)[M])a,n,m);
for(int i=0; i < m; ++i){
for(int j=0; j < n; ++j){
if(*(&a[0][0]+j*M+i) != 0){
*row = j;
*column = i;
return true;
}
}
}
return false;
}
double a[N][M];
printf("Enter matrix:\n");
if (!read_matrix((double (*)[M]) a, n, m)) {
printf("Invalid matrix!\n");
return ERROR;
}
最好的方法是什么?我在这里做的方式只在第二次迭代中接收一行。
解决方案
当心指针算术不是原始地址算术。
就像a
声明的 2D 数组一样double a[N][M];
,它将衰减为指向行的指针。这意味着第 i 行的地址是a+i
而不是a+M*i
。
当您使用 1D 模拟 2D 数组时使用后者:int aa[N*M];
. 这里aa
将衰减为一个int
指针,第 i 行的开头将在aa+M*i
.
调用应该是:
//Find the leading element in a+M*i
if(!find_leading_element((a+i),n-i,m,&rowLead,&columnLead)){
return;
}
推荐阅读
- python - 使用 BeautifulSoup 提取特定标题下的文本
- javascript - Nestjs 触发关机和重启
- javascript - Jquery 与纯 javascript,为什么我的代码不起作用?
- flutter - 如何用图像填充整个屏幕以使圆边也包含在内?
- math - 数学 - 百分比到范围转换
- r - 为什么我不能在 R 中使用 Microsoft Word 的“”符号?
- excel - 比较两列并突出显示关联列中的差异
- json - 在 SSIS 中读取具有 JSON 列的 csv 文件?
- python - 需要帮助定义列表而不更改它已有的值
- javascript - 使用 axios 在 Node js 中未定义的标头