c语言中向函数传递二维矩阵的方法

在C语言中,向函数传递二维数组有几种方式,这主要取决于二维数组的大小是否已知。下面是几种常见的方式:   

1)如果二维数组的大小已知,那么你可以在函数参数中直接指定数组的大小。例如:  void func(int arr[10][10]) { ... }  在这个例子中,func函数接受一个10x10的二维数组作为参数。   

2)如果二维数组的第一维的大小未知,但是第二维的大小已知,那么你可以只指定第二维的大小。例如:  void func(int arr[][10], int size) { ... }  在这个例子中,func函数接受一个二维数组作为参数,数组的第二维的大小是10,第一维的大小是size。   

3)如果二维数组的大小完全未知,那么你可以将其视为一个指针的指针。例如:  void func(int **arr, int rows, int cols) { ... }  在这个例子中,func函数接受一个指针的指针作为参数,然后使用rows和cols参数来获取数组的大小。   

需要注意的是,如果你选择使用指针的指针来表示二维数组,那么你需要使用动态内存分配(例如malloc或者calloc函数)来创建二维数组,并在使用完后使用free函数来释放内存。    

 

int sum2DArray(int **arr, int *start, int *end)
{
    int sum = 0;
    // int *p = *arr;
    int *p = NULL;
    p = start;
    while (p < end)
    {
        sum += *p;
        p++;
    }
    return sum;
}

void main(){
    int arr1[3][4] = {0};
    int arr2[3][4] = {0};
    int arr3[3][4] = {0};
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            arr1[i][j] = i + j;
            arr2[i][j] = i - j;
            arr3[i][j] = i * j;
        }
    }
    int *ptr_arr_start = &arr2;
    int *ptr_arr_end = &arr2 + 1;
    sum = sum2DArray(arr2, ptr_arr_start, ptr_arr_end);

}

但是上面有错误

int sum2DArray(int *start, int *end)
{
    int sum = 0;
    int *p = start;
    while (p < end)
    {
        sum += *p;
        p++;
    }
    return sum;
}

void main(){
    int arr1[3][4] = {0};
    int arr2[3][4] = {0};
    int arr3[3][4] = {0};
    int i, j, sum;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            arr1[i][j] = i + j;
            arr2[i][j] = i - j;
            arr3[i][j] = i * j;
        }
    }
    int *ptr_arr_start = &arr2[0][0];
    int *ptr_arr_end = &arr2[2][3] + 1;
    sum = sum2DArray(ptr_arr_start, ptr_arr_end);
    printf("Sum of elements in arr2: %d\n", sum);
}

 或者

int sum2DArray(int arr[3][4], int rows, int cols)
{
    int sum = 0;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            sum += arr[i][j];
        }
    }
    return sum;
}

void main(){
    int arr1[3][4] = {0};
    int arr2[3][4] = {0};
    int arr3[3][4] = {0};
    int i, j, sum;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            arr1[i][j] = i + j;
            arr2[i][j] = i - j;
            arr3[i][j] = i * j;
        }
    }
    sum = sum2DArray(arr2, 3, 4);
    printf("Sum of elements in arr2: %d\n", sum);
}

 

 

还有一种,是保存每一行首元素的地址,这里传入函数的p是一个二级指针,p[i]就已经是一个一级指针了,可以直接使用p[i][j]来访问二维数组的元素

main函数中的 int *p[3]就是一个指针数组,用于保存一个二维数组每一行首元素的地址

int sum2DArrayMethod3(int **p, int rows, int cols)
{
    int sum = 0;
    int i = 0, j = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            sum += p[i][j];
            printf("the element of row: %d col: %d is %d\n", i, j, p[i][j]);
        }
    }
    return sum;
}


void main{
    int rows = 3;
    int cols = 4;
    // sum2 = sum2DArrayMethod2(arr2, rows, cols);

    int *p[3] = {NULL};
    for (i = 0; i < rows; i++)
    {
        p[i] = &arr2[i][0];
    }
    sum2 = sum2DArrayMethod3(p, rows, cols);
}

 可以修改为

int sum2DArray(int arr[3][4], int rows, int cols)
{
    int sum = 0;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            sum += arr[i][j];
        }
    }
    return sum;
}

int main(){
    int arr1[3][4] = {0};
    int arr2[3][4] = {0};
    int arr3[3][4] = {0};
    int i, j, sum;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 4; j++)
        {
            arr1[i][j] = i + j;
            arr2[i][j] = i - j;
            arr3[i][j] = i * j;
        }
    }
    sum = sum2DArray(arr2, 3, 4);
    printf("Sum of elements in arr2: %d\n", sum);
    return 0;
}

 

posted on 2023-11-27 14:05  风中狂笑  阅读(263)  评论(0编辑  收藏  举报

导航