【方法一:一次性创建全部数组空间】
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 创建二维数组 int[4][10]
int i, j;
int **array = (int **)calloc(4, sizeof(int *)); // 首先创建顶层指针array[][]
array[0] = (int *)calloc(4, 10 * sizeof(int *)); // 这个二维数组一共有4 * 10个int型的连续空间,把这40个元素的空间直接一次性创建,然后把其中第一个元素的地址赋给指针数组array的第一个元素
/*
其实这个二维数组就是一个连续的40个int空间
和一位数组int[40]没什么本质区别
只不过我们又创建了指针数组int *array[4],其中这个数组的每个元素都是一个指针
第一个指针array[0]指向这个空间的第0个元素开头
第二个指针array[1]指向这个空间的第10个元素开头
第三个指针array[2]指向这个空间的第20个元素开头
第四个指针array[3]指向这个空间的第30个元素开头
这样一来,我们就可以以为array[0] ~ [3]每个都是一个长度为10的int数组了
至于*array其实就相当于array[0]
*/
array[1] = array[0] + 10; // 把第10个元素的地址赋给array[1]
array[2] = array[0] + 20;
array[3] = array[0] + 40;
// array[0] 就是我们刚才创建的空间的首地址
for (i = 0; i < 4; i++)
for (j = 0; j < 10; j++)
array[i][j] = (i + 1) * (j + 2);
for (i = 0; i < 4; i++)
{
for (j = 0; j < 10; j++)
printf("%d ", array[i][j]);
putchar('\n');
}
free(*array); // 一次性释放全部int空间
free(array); // 释放指针空间
return 0;
}
输出结果:
2 3 4 5 6 7 8 9 10 11
4 6 8 10 12 14 16 18 20 22
6 9 12 15 18 21 24 27 30 33
8 12 16 20 24 28 32 36 40 44
--------------------------------
Process exited after 0.006671 seconds with return value 0
Press any key to continue . . .