在刷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
赋值成功,没调用前是随机值,调用后为我们所赋的值