重口味3d里番还有没有:在c++里如何动态定义1个2维数组 ?

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 07:30:27
rt

c++里动态定义2维数组方法为:

  1. 定义二维指针

  2. 分配”行指针“数组

  3. 为每行分配数据数组

  4. 使用二维数组

  5. 释放每行的数据数组 (不再使用该内存后,要手工完成内存的释放)

  6. 释放”行指针“数组

参考代码:

#include <iostream>
#include <iomanip>
using namespace std ;
#define ROW 5
#define COL 10
int main()
{
    int **pp,i,j;
    pp=new int *[ROW]; //分配行指针数组,返回数组首地址给pp
    for( i=0;i<ROW;i++ )
        pp[i]=new int[COL]; //为每行分配数据数组

for( i=0;i<ROW;i++ ){
        for( j=0;j<COL;j++ )
            pp[i][j]=(i+1)*(j+1) ; //向二维数组中存储数据
    }
cout << "ARRAY's ADDRESS: " << pp <<endl;
    for( i=0;i<ROW;i++ ){
        cout << "ROW_"<<i+1<<"'s ADDRESS: "<< pp[i] ; //输出每行的地址
        for( j=0;j<COL;j++ )
            cout << setw(3)<<pp[i][j] ; //输出数组元素
        cout <<endl ;
    }

    for( i=0;i<ROW;i++ )
        delete []pp[i]; //释放每行的指针
    delete []pp ; //释放指针数组
    return 0;
}

c++动态定义2维数组,实际上是先分配一个指针数组,然后再为每个指针数组分配相应的数据数组。与真正的二维数组的差别是:

  1. 二维数组的存储空间是在内存中连续的,实际上还是个一维数组,只是将一维数组分成了N段;而动态分配的二维数组,其行指针数组是一个连续的一维数组,其中存储的是一维指针,这些指针值不一定是连续的,与内存使用情况有关。

  2. 从中还可以看出,动态二维数组,比真正的二维数组多了一个行指针数组的多余内存消耗。

  3. 动态定义的二维数组每一行的列宽可以是变化的(一般情况下是一样宽的);真正的二维数组每行的列宽必须且只能一样。

  4. 真正的二维数组在其所定义的函数结束后,内存自动释放;动态定义的二维数组,需要用显式的代码进行内存释放。

二维数组有两层的意思,第一维是一个指针数组,第二维就是第一维中每个指针所指向的数组,下面是一个实例:
int** ptr1 = new int*[4]; //先定义第一维,他们是一个指针数组,这里是int类型。 因为是指向指针的数组所有所用了 int**
for(int i=0;i<4;i++)
ptr1[i] = new int[4]; //第一维中的每个指针又是指向一个数组的。

下面是一个程序可以看看:

int main(int argc, char* argv[])
{
int** ptr = new int*[4];
int i,j;
for(i=0;i<4;i++)
ptr[i] = new int[4];
for(i=0;i<4;i++) //为每一个数赋值
for(j=0;j<4;j++)
ptr[i][j] = i*j;
for(i=0;i<4;i++) //将所有的数值显示出来
{
for(j=0;j<4;j++)
{
cout<<j<<' ';
}
cout<<endl;
}

return 0;
}

先在开始时定义一个指针
比如:
int * a;
然后需要时定义数组:
a =new int[8][8];
就是定义一个64个数的二维数组。也可以这样:
a =new int[8][];
是定义一个列数不确定的二维数组,
访问时数组名是a
比如a[0][2]

#include<vector>
...
vector<vector<int> > arr;

够动态吧?