动态分配一维数组、二维数组!

某些数组在我们定义时并不能明确知道其范围,他们虽调用的变化而变化,当然我们也可以预定一个比较大的MAXNLEN但这种静态声明有时会浪费比较多的内存空间。我们可以用C++的动态内存分配机制来动态地确定一个数组的空间大小,使用动态内存分配时,一定不要忘了delete!!!

   例如要给一个整数动态分配内存空间,必须用下面的语句声明一个整形指针变量。

int *y;

// 把声明,动态存储分配,赋值合并为下

int *y = new int;
*y = 284;

//或者

int  *y = new int(220);

一维数组:

int *arr = new int[len];

操作符new为len个整形数分配了存储空间,并返回第一个整形数空间的指针。 


delete操作符(Important):

动态分配的存储空间不需要时应该要将其释放,否则可能会导致内存泄漏,程序崩溃等许多严重问题。

//释放变量内存
delete y;

//释放一维数组内存
delete[] x; 


二维数组:

      虽然C++采用很多机制来说明二维数组,但这些机制大多要求在编译时就知道两维的大小。具体来说,使用这些机制很难编写出这样的函数,他的形参是一个第二维大小未知的二维数组。之所以如此说,是因为当形参是一个二维数组时,必须制定第二维的大小。例如a[][10]是一个有效的形参而a[10][]则不是。

如果数组的列数在编译时也是未知的,那么不可能仅调用一次new就创建这个二维数组(即使数组的行数在编译时是已知的)。要构造这样的二维数组,可以把它看做是由若干行所构成的结构,每一行都是一个能用new来创建的一维数组。指向每一行的指针保存在另一个一维数组之中。


template<class T>

bool make2dArray(T ** &arr, int numberOfRows, int numberOfColumns) {
        //创建一个二维数组
        
        try{
                //创建行指针
                arr = new T * [numberOfRows];
                
                //为每一行分配空间
                for(int i = 0; i < numberOfRows; ++i) {
                        arr[i] = new int [numberOfColumns];
                }
                return true;
        }catch (bad_alloc) {
                        cerr << "Out of memory" << endl;
                        return false;
                }
}


读者可以借此思考一下,编写一个更具一般性的算法,比如不浪费存储空间的情况下开一个二维数组,该数组的每一行所含元素的个数可能不同。

可以参考我的另一篇博客!

更具一般性的二维数组C++实现!

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页