为什么要使用动态存储分配?我想这个问题的答案可以归结于三点:
1 在定义一个二维数组的时候我事先并不知晓要给他分配具体多少行多少列时
2 算法移植到芯片的时候考虑节省内存时
3 子函数调用想要很方便的传递二维数组的地址时
单就第一点而言,也许有同学会问,你自己写程序你怎么会不知道要给他分配多少空间?但事实就是,当你身在团队之中,很多时候你都是只知道接口给你传递过来的某些参数,而这些参数的值你不知道也就不足为奇了。关于上面的1和2两点我想是使用动态分配内存的最关键的原因,至于第三点不算是太重要,因为静态的二维数组也可以通过子函数去传递数组的地址,只不过那个稍微有点麻烦而已。
好吧,看一个小小的程序实例,在main函数中动态的分配了二维数组a和b,调用InitArray函数分别初始化a中所有元素为1,b中所有元素为2,调用SumArrar函数实现两个数组相加,相加的结果依然存放到数组a中。
#include <stdio.h>
void InitArray(int **Arr, int row, int col, int x)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
Arr[i][j] = x;
}
}
}
void PrintArray(int **Arr, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", Arr[i][j]);
}
printf("\n");
}
}
void SumArray(int **ArrayA, int **ArrayB, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
ArrayA[i][j] = ArrayA[i][j] + ArrayB[i][j];
}
}
}
void main()
{
int row = 3;
int col = 4;
int **a;
int **b;
a = new int *[row];
b = new int *[row];
for (int i = 0; i < col; i++)
{
a[i] = new int[col];
b[i] = new int[col];
}
InitArray(a,row,col,1);
InitArray(b,row,col,2);
SumArray(a,b,row,col);
PrintArray(a,row,col);
}
可以看到,这个分配方式是很方便的,尤其要说的是在调用子函数传递数组的地址时简洁明了。
动态分配的内存如何释放呢?但看此例,假如我们已经使用完了a和b之后,他们的空间就不需要在驻留到内存了,释放起来也是非常简单的。
for (int i = 0; i < row; i++)
{
delete[] a[i];
delete[] b[i];
}
delete[] a;
delete[] b;