最近遇到了一个螺旋矩阵的问题,需要用到二维数组,由此研究下二维数组的动态分配。在这之前首先要了解二维指针。原文参见二维数组指针
引用块内容
三种二维指针的表示方法
(1)、int **Ptr;
(2)、int *Ptr[ 5 ];
(3)、int ( *Ptr )[ 5 ];
以上三例都是整数的二维数组,都可以用形如 Ptr[ 1 ][ 1 ] 的
方式访问其内容;但它们的差别却是很大的。
具体的差别见原文。
然后就研究动态分配了!以下关于动态分配的代码引用自C++中二维数组的动态分配
二维数组的定义可以如下:
int array2D()
{
int m ;
int n ;
cin >> m >> n;
int **array2D = new int *[m];//分配行指针的组数
for (int i = 0; i < m; i++)
{
array2D[i] = new int [n];//为每行指针分配空间
}
//在这里编写需要的操作
//使用完后别忘了释放空间避免内存泄漏
for (int i = 0; i < m; i++)
delete[]array2D[i];
delete array2D;
return 0;
}
此外,还可以分配静态数组不能实现的不等长二维数组(即每行分配空间时用数组代替常数)
例:
int array2D()
{
int i, j;
int m=3;
int n[3]={1, 2, 3};
//行指针数组
int** array2D=new int*[m];
//每行分配不一样多的空间
for(i=0; i
array2D[i]=new int[n[i]];
}
//再此执行操作
//删除分配的空间
for(i=0; i
delete[] array2D[i];
}
delete[] array2D;
return 0;
}
最后附上螺旋矩阵的实现。详情见二维数组动态分配and螺旋矩阵
int matrix()
{
int i, j;
int n;
cout << "请输入矩阵大小:" << endl;
cin >> n;
//动态分配二维数组
int** matrix = new int*[n];
for (i = 0; i < n; i++)
{
matrix[i] = new int[n];
}
int m, k;
j = 0;
m = n;
int count = 1;
for (k = 0; k < (n + 1) / 2; k++)
{
for (i = k; i < m; i++)
{
matrix[j][i] = count;
count++;
}
i--;
j++;
for (; j < m; j++)
{
matrix[j][i] = count;
count++;
}
j--;
i--;
for (; i >= k; i--)
{
matrix[j][i] = count;
count++;
}
i++;
j--;
for (; j > k; j--)
{
matrix[j][i] = count;
count++;
}
j++;
m--;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cout << matrix[i][j] << "\t";
}
cout << endl;
}
//释放内存
for (i = 0; i < n; i++)
{
delete[] matrix[i];
}
delete[] matrix;
return 0;
}