如何传递一个二维数组来使用像 C 中的 M*i 这样的行偏移量?

How to pass a 2D array to function with a row offset like M*i in C?

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);
}

我正在做一个小型学校项目来减少矩阵,但在传递带有偏移量的二维数组时遇到了一些麻烦。

我需要 find_leading_element 来获取二维数组,并且 return 通过指针获取该矩阵中前导元素的行和列。

所以find_leading_element return是相对于它得到的矩阵的行和列,没关系我稍后再处理。现在的问题是传递具有行偏移量的二维数组。

所以每次迭代我都会传递矩阵但少一行。因为我不能改变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 是一个声明为 double a[N][M]; 的二维数组,它将衰减为指向一行的指针。这意味着第 i 行的地址是 a+i 而不是 a+M*i.

当您用一维数组模拟二维数组时使用后者: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;
}