今天写程序,因为涉及到二维数组的动态创建及释放问题,浏览了相关的文章才发现我的思路有些错误;
例如:
int** b;
int a[2][3];
b=a; //这句会报错,cannot convert "int[2][3]" into "int**"
例如:
int (*b)[3]; //注意一定要让b指向一个含有三个指定类型元素的数组
int a[2][3];
b=a; //这样就ok了
例如:
int a=2,b=3;
new int[a][b]; //不像一维动态数组,这样声明的二维数组会报错
例如:
int (*b)[3]=new int[2][3];
例如:
int a=2,b=3;
int** c=new int*[a];
for(int i=0;i<a;i++) c[i]=new int[b];
//这样就ok
int a=2,b=3,d=4;
int** c=new int*[a];
c[0]=new int[b]; //第一行含有b=3个元素
c[1]=new int[c]; //第二行含有c=4个元素
for(int i=0;i<2;i++)
delete[3] b[i];
delete[2] b;
b=NULL;
//未测试,一会回去测试
for(int i=0;i<;i++) //与创建的顺序完全相反,先释放第二维,再释放第一维
delete[b] c[i]; //释放动态创建的第二维int型数组
delete[a] c; //再释放动态创建的第一维int*型指针数组
c=NULL;
我一直认为二维数组名就是指针的指针:
这说明这两个地址不是同一类地址,即指向int型指针的指针不同于二维int型数组首地址.
1.
一定要使用指向数组的指针才ok
以上这些是关于二维数组地址赋值问题
另外我发现,dev-C++中不能直接动态创建可变动大小的动态二维数组;
而只能静态创建二维数组
PS:这里的b是指向整个三维int型数组的指针,而不是指向首元素的指针,因此他是一个更高维的指针,同二维数组名.可以b[1][1]这样访问数组中的元素,因为这里的b是一个行指针,指向二维数组中的每一行。而b[1],b[2]等是指向二维数组的列指针,也就是相当于降了一维。
2.
因此要动态创建可变动大小的数组必须使用网上提到的另一种方法
这里的以一个new创建的是一个指针数组,这个指针数组中的每一个元素指向int型一维数组的首地址,然后再用第二个new创建多个一维int型数组,并将这些一维int型数组首地址赋值给第一个new创建的指针数组中的每一个元素,这样就完成了一个动态的二维数组的创建。
与标准的矩阵不同的是,这里的二维数组的每一行所包含的元素可以是不同的,即不一定是一个长方形的矩阵 如下:
而且还可以通过c[0][0]来访问二维数组中的[0][0]元素(已测试),这样与平常使用的二维数组习惯统一起来了,看来指针的指针还是和二维数组元素有很大的联系,只不过使用方式上需要注意的。
上面第一种和第二种动态创建二维数组的区别是,通过指向数组的指针来创建的二维数组是一个标准的矩阵,即每一行所包含的元素的个数都是相同的;而通过第二种方法创建的数组的每一行所包含的元素的个数可以不一致,因此不是一个标准的二维矩阵.
以上是动态的创建一个二维数组;下面是相反的过程,利用delete来释放二维数组
1.
对于第一种方法创建的标准矩阵形式的二维数组的释放方法是:
2.
对于第二种方法创建的为标准二维数组的释放方法如下: