1. 开辟动态二维数组
C语言标准库中并没有可以直接开辟动态二维数组的函数,但我们可以通过动态一维数组来模拟动态二维数组。
二维数组其实可以看作是一个存着"DataType []"类型数据的一维数组,也就是存放着一维数组地址的一维数组。
所以,我们就可以动态开辟一个数组指针数组,再为每一个元素动态开辟一个一维数组的空间,以此来模拟动态二维数组。
但是,数组指针数组似乎也不太好开辟,或者说开辟完后不太符合我们的预期,因为其元素的类型为"DataType [n]",所指定的一维数组的大小无法修改。
所以,我们一般用" DataType* "来代替"DataType [n]",而动态二维数组的类型也被我们定义为" DataType** "。
#include <stdlib.h>
typedef int DataTypeint main()
{int m = 5;int n = 4;DataType** TDarr = (DataType**)malloc(sizeof(DataType*) * m);for(int i = 0; i < m; i++){TDarr[i] = (DataType*)malloc(sizeof(DataType) * n);}
}
2. 注意事项
由于各个一维数组是分别动态开辟的,所以它们在内存中并不是连续存放的。
我们在使用动态二维数组时,无论是通过"DTarr[i][j]"的方式,还是通过" *(*(DTarr+i)+j) "的方式来访问元素都是没有问题的,因为这两种方式都是通过元素之间的逻辑关系来访问。
但是,如果我们像在传统二维数组中一样,通过" *(DTarr+i+j) "的方式来访问则会发生错误(访问到错误元素或越界访问),这就是由于二者的物理结构不同。
通过定义动态二维数组的思想,我们可以类比定义出动态n维的数组。