C语言中,二维数组如何作为实参传递

在刷leetcode题经常想用到二维数组的传递,但经常出现问题,然后上网搜索各种传递二维数组的方法,经过自己探索,有以下方法:

二维数组的作为返回值时,只能通过malloc的内存空间,因为定义二维的二维数组在

定义二维数组的两种方法:

                一:用malloc分配一个堆空间
                二:定义一个二维数组传递

本质上,二维数组是按照行展开的方法在内存中存储的,按照一维数组操作的。

一、使用malloc定义

1.定义方法

1.1使用malloc/calloc先定义行,再定义列

#define MAX_NUm 10000

int ** Arr= malloc(sizeof(int*) * MAX_NUM);
for(int i = 0; i < 3; i++)
{
    Arr[i] = malloc(sizeof(int)* 3);
}

 定义一个MAX_NUM行*3列数组

1.2. 使用malloc/calloc定义一个连续(行* 列)的空间


    int i = 100, j = 2;

    //直接定义一个连续的空间,用做二维数组
    int *Arr = (int *)calloc(100,sizeof(int)*2);

    testTwoDimentionArrPass(Arr, i, j);

2.赋值方法

2.1先定义行,再定义列的二维数组赋值方法

方法一:
Arr[cnt][0] = nums[i];
Arr[cnt][1] = nums[left];
​​​​​​​Arr[cnt][2] = nums[right];

或者 

方法二:
*(*(Arr + cnt) + 0) = nums[i];
*(*(Arr + cnt) + 1) = nums[left];
*(*(Arr + cnt) + 2) = nums[right];

方法一很好理解,同二维数组,方法二因为我们定义时先定义了一个 MAX_NUM 大小的 int * 空间,首地址就是Arr,每一空间存着大小为 sizeof(int) * 3 大小的空间的首地址。从二维看就是MAX_NUM行3列,因此要通过指针调用首先把行找到:*(Arr + cnt) ,cnt时用来记录行数的;在行的首地址加上列的偏移就是对应的空间了。例如:*(*(Arr + cnt) + 0) = nums[i];使用的时cnt行0列的空间。

2.2连续(行* 列)的空间二维数组赋值方法

*(Arr + 0 * j + 0) = 15;

*(Arr + 0 * j + 1) = 20;

3.传递二维数组方法

3.1调用者(1和2调用相同)

testTwoDimentionArrPass(Arr, i, j);

3.2被调用者

1.
int testTwoDimentionArrPass(int **Arr, int i, int j)

2.
int testTwoDimentionArrPass(int *Arr, int i, int j)

二、定义一个二维数组

int Arr[100][2];

1.传递二维数组调用方法

调用者:

int majorityElement(int* nums, int numsSize){
    //test TwoDimentionArrPass
    int i = 100, j = 2;
    int Arr[100][2];





    //调用前
    printf("0:%d 1:%d\n",Arr[0][0],Arr[0][1]);

    //调用testTwoDimentionArrPass
    testTwoDimentionArrPass((int *)Arr, i, j);

    //调用后
    printf("0:%d 1:%d\n",Arr[0][0],Arr[0][1]);





    return 0;
}

被调用者:

int testTwoDimentionArrPass(int *Arr, int i, int j)
{
    //给第0行的第0,1列赋值
    *(Arr + 0 * j + 0) = 15;
    *(Arr + 0 * j + 1) = 20;
    return 0;
}

结果

//调用前
0:-1848695408 1:32764
//调用后
0:15 1:20

赋值成功,没调用前是随机值,调用后为我们所赋的值

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值