首页 > 解决方案 > 如何将二维数组传递给具有行偏移量的函数,如 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;
}

最好的方法是什么?我在这里做的方式只在第二次迭代中接收一行。

标签: carrays2d

解决方案


当心指针算术不是原始地址算术。

就像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;
}

推荐阅读