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   风中狂笑  阅读(1339)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示